基本数据结构二叉树(3)

目录

4.二叉树链式结构的操作

4.1 前置说明

4.2二叉树的遍历

4.2.1 前序、中序以及后序遍历

4.3 节点个数以及高度等


4.二叉树链式结构的操作

4.1 前置说明
由于博主对二叉树的结果掌握还不够深入,因此在讲解相关操作前将手动创建一颗简单的二叉树,快速进入正题,等博主二叉树结构了解的差不多时,我将会进行内容补充。
typedef struct TreeNode
{int data;struct TreeNode* left;struct TreeNode* right;
}TreeNode;TreeNode* CreateNode(int x)
{TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));node->data = x;node->left = NULL;node->right = NULL;return node;
}
TreeNode* node1 = CreateNode(1);
TreeNode* node2 = CreateNode(2);
TreeNode* node3 = CreateNode(3);
TreeNode* node4 = CreateNode(4);
TreeNode* node5 = CreateNode(5);
TreeNode* node6 = CreateNode(6);node1->left = node2;
node1->right = node4;
node2->left = node3;
node4->left = node5;
node4->right = node6;TreeNode* root = node1;
注意:上述代码 并不是创建二叉树的方式 ,真正创建二叉树方式后序详解重点讲解。
再看二叉树基本操作前,再回顾下二叉树的概念, 二叉树是:
1. 空树
2. 非空:根节点,根节点的左子树、根节点的右子树组成的。
从概念中可以看出,二叉树定义是 递归式 的,因此后序基本操作中基本都是按照该概念实现的。
4.2二叉树的遍历
4.2.1 前序、中序以及后序遍历
学习二叉树结构,最简单的方式就是遍历。所谓 二叉树遍历 (Traversal) 是按照某种特定的规则,依次对二叉 树中的节点进行相应的操作,并且每个节点只操作一次 。
访问结点所做的操作依赖于具体的应用问题。 遍历 是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。
按照规则,二叉树的遍历有: 前序 / 中序 / 后序的递归结构遍历 :
1. 前序遍历 (Preorder Traversal 亦称先序遍历 )—— 访问根结点的操作发生在遍历其左右子树之前。
2. 中序遍历 (Inorder Traversal)—— 访问根结点的操作发生在遍历其左右子树之中(间)。
3. 后序遍历 (Postorder Traversal)—— 访问根结点的操作发生在遍历其左右子树之后。
由于被访问的结点必是某子树的根, 所以 N(Node )、 L(Left subtree )和 R(Right subtree )又可解释为 根、根的左子树和根的右子树 。 NLR 、 LNR 和 LRN 分别又称为 先根 遍历、 中根 遍历和 后根 遍历。
下面主要分析 前序 递归遍历,中序与后序图解类似,伙伴们可以自己动手绘制。
前序遍历递归图解 :
切记:初次学习一定要画递归展开图便于自己更深入理解递归
下面是实例测试代码(仅供参考):
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef struct TreeNode
{int data;struct TreeNode* left;struct TreeNode* right;
}TreeNode;TreeNode* CreateNode(int x)
{TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));node->data = x;node->left = NULL;node->right = NULL;return node;
}//前序遍历
void PrevOrder(TreeNode* root)
{if (root == NULL){printf("N ");return;}printf("%d ", root->data);PrevOrder(root->left);PrevOrder(root->right);
}//中序遍历
void InOrder(TreeNode* root)
{if (root == NULL){printf("N ");return;}PrevOrder(root->left);printf("%d ", root->data);PrevOrder(root->right);
}//后序遍历
void PostOrder(TreeNode* root)
{if (root == NULL){printf("N ");return;}PrevOrder(root->left);PrevOrder(root->right);printf("%d ", root->data);
}void test01()
{//创树TreeNode* node1 = CreateNode(1);TreeNode* node2 = CreateNode(2);TreeNode* node3 = CreateNode(3);TreeNode* node4 = CreateNode(4);TreeNode* node5 = CreateNode(5);TreeNode* node6 = CreateNode(6);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;TreeNode* root = node1;//前序遍历PrevOrder(root);printf("\n");//中序遍历InOrder(root);printf("\n");//后序遍历PostOrder(root);printf("\n");}int main()
{test01();return 0;
}
4.3 节点个数以及高度等

1..计算高度:

//方法一
int TreeHeight(TreeNode* root)
{return TreeHeight(root->left) > TreeHeight(root->right) ?TreeHeight(root->left) + 1 :TreeHeight(root->right) + 1;
}//方法二
int TreeHeight(TreeNode* root)
{if (root == NULL)return 0;int left = TreeHeight(root->left);int right = TreeHeight(root->right);return left > right ? left + 1 : right + 1;
}

由于方法一中比较时就开始递归了,却没有记录数据,导致后一条语句又要进行递归遍历,非常耗时间,因此用第二种方法更好

2.计算总结点个数:
int TreeSize(TreeNode* root)
{return root == NULL ? 0 :TreeSize(root->left) +TreeSize(root->right) + 1;}

此为三目操作符的运用

3.计算第k层的节点个数:

int TreeKSize(TreeNode* root,int k)
{assert(k > 0);if (root == NULL)return 0;if (k == 1)return 1;return TreeKSize(root->left, k - 1)+ TreeKSize(root->right, k - 1);
}

4.叶节点个数:

int TreeLeafSize(TreeNode* root)
{if (root == NULL)return 0;if (root->left == NULL&& root->right == NULL)return 1;return TreeLeafSize(root->left) +TreeLeafSize(root->right);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/178619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金字塔原理 读书笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言第1篇 表达的逻辑第1章 为什么要用金字塔结构归类分组&#xff0c;将思想组织成金字塔自上而下表达&#xff0c;结论先行自下而上思考&#xff0c;总结概括 第2…

Unity 接入TapADN播放广告时闪退 LZ4JavaSafeCompressor

通过跟踪安卓日志&#xff0c;发现报如下错误 Didnt find class "com.tapadn.lz4.LZ4JavaSafeCompressor" 解决方案&#xff1a; 去掉Minify这边的勾选&#xff0c;再打包即可。

trino push down fliter

依据trino 432 版本而写 1. 调用链 2. 先是元数据&#xff0c;然后做扫描数据层的filter pushFilterIntoTableScan

数据导入与预处理-第7章-数据清理工具OpenRefine

文章目录 数据清理工具OpenRefineOpenRefine简介下载与安装配置创建项目操作列收起列移动列和重排列移除该列与移除列重新定义列标题撤销与重做导出数据 进阶操作数据排序数据归类重复检测数据填充文本过滤数据转换 总结 数据清理工具OpenRefine OpenRefine简介 OpenRefine是…

【论文阅读】【基于隐蔽带宽的汽车控制网络鲁棒认证】中的一些顶会论文摘要

读摘要&#xff0c;了解面貌 文章目录 [12][51][58][35][xx] 原文&#xff1a;https://webofscience.clarivate.cn/wos/alldb/full-record/WOS:000387820900034 Large numbers of smart connected devices, also named as the Internet of Things (IoT), are permeating our en…

深度学习之基于百度飞桨PaddleOCR图像字符检测识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介主要特点使用步骤 二、功能三、系统四. 总结 一项目简介 # Introduction to PaddleOCR Image Character Detection and Recognition System Based on Baidu…

享元模式-C++实现

享元模式&#xff08;FlyWeight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在减少对象创建的数量&#xff0c;节省内存和提高性能。 在某些情况下&#xff0c;一个项目里可能需要创建大量相似的对象&#xff0c;这样对象的一部分是共享的&#xff08;相同的&…

Java基础-中级-高级面试题汇(一)

第一部分&#xff1a; Java基础面试题汇总 1.面向对象和面向过程的区别&#xff1f; 面向对象和面向过程是两种不同的编程思想。面向对象是一种以对象为中心的编程思想&#xff0c;将数据和处理数据的方法封装在一起&#xff0c;形成一个类。程序通过创建对象来调用类中的方法…

静态住宅IP代理实际应用:它的强大用途你知道吗?

静态住宅IP代理与动态IP代理相比&#xff0c;提供了更稳定的网络身份&#xff0c;使得企业在进行数据采集、区域定位营销和市场研究时更为高效。同时&#xff0c;它也是提高在线隐私保护和避免封禁的有效工具。 通过详细分析&#xff0c;你将能全面了解静态住宅IP代理的应用&a…

SAP_ABAP_编程基础_字符转换_内存表、jsonString 相互转换

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读441次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

【力扣:1707 1803】0-1字典树

思路&#xff1a;树上每个节点存储拥有该节点的数组元素的最小值&#xff0c;left节点表示0&#xff0c;right节点表示1&#xff0c;构建完成后遍历树当子节点没有比mi小的元素时直接输出-1&#xff0c;否则向下构造。 struct tree{int m;tree*leftnullptr,*rightnullptr;tree…

【传智杯】儒略历、评委打分、萝卜数据库题解

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;请不要相信胜利就像山坡上的蒲公英一样唾手…

人工智能在现代科技中的应用和未来发展趋势-AI生成

人工智能&#xff08;AI&#xff09;是一种计算机科学技术&#xff0c;它为计算机系统赋予了类似人类思维和学习能力的功能。人工智能在现代科技中的应用越来越广泛&#xff0c;从智能手机到智能家居、自动驾驶汽车、医疗诊断、金融交易、机器人等众多领域都可以看到人工智能的…

精调llama模型

github地址&#xff1a;https://github.com/facebookresearch/llama-recipes github:https://github.com/facebookresearch/llama import torch from transformers import LlamaForCausalLM, LlamaTokenizer#model_id"./models_hf/7B" # 可以从huggingface上面下载模…

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

文章目录 14.5 2012 Federal Election Commission Database&#xff08;2012联邦选举委员会数据库&#xff09;1 Donation Statistics by Occupation and Employer&#xff08;按职业与雇主划分的捐赠数据&#xff09;2 Bucketing Donation Amounts&#xff08;桶捐赠额&#x…

vue项目实战-电商后台管理系统

项目简介&#xff1a; 该项目为电商后台的管理系统。设计了登录页面。 管理人员需要通过输入正确的用户名和密码才能登录。登陆成功之后进入管理页面&#xff1a; 管理页面由五个子模块组成&#xff1a;用户管理&#xff0c;权限管理&#xff0c;商品管理&#xff0c;订单管理…

实验八-数据处理

目录 1.数据来源 2.对于All表&#xff1a; 3.对于sf 和sfweibo 表&#xff1a; 4. 对于base_info表&#xff1a; 5.导出最后结果到一个Excel文件中&#xff0c;完成数据处理。 1.数据来源 本次所分析的数据是通过爬虫抓取的微博数据。选取新浪微博为数据平台&#xff0c;选…

electron打包 Error output: !include: could not find:

Error output: 2 !include: could not find: "C:\Users\xxxx(这里是中文)\AppData\Local\Temp\t-TH3KzB\0-messages.nsh" 3 Error in script "<stdin>" on line 75 -- aborting creation process这个报错意思是路径有中文存在&#xff0c;解析不到&a…

STM32CubeIDE(ADC)

学习链接&#xff1a;【HAL库详解】STM32 ADC HAL库使用_哔哩哔哩_bilibili 目录 一、概念 1、ADC介绍 2、ADC主要特征 二、ADC模式 1、查询模式 1.1 单通道采集软件配置 1.2 查询模式步奏 1.3 单通道采集主要代码 2、多通道采集 2.1 软件配置 2.2 主要代码 一、概…

【Linux】Linux第一个小程序 --- 进度条

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和Linux还有算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 …