二叉树链式结构基础

news/2024/11/26 23:32:10/

一、前中后序遍历

1、前序遍历:前序遍历是采用 根 - 左子树 - 右子树 的顺序遍历二叉树。

也就是把整棵树分为一个个子问题,每个结点都可以看作 根、左子树、右子树 三个部分

 (左右子树可以为空,就是单节点,根为空就表示探索完成,返回)。

前序遍历就是先保存根,然后向左探索,遇到空回来后向右探索。

当所有结点的 根、左子树、右子树 都探索完成,整棵树也就探索完成了。 

 代码如下:

//前序遍历
void BinaryTreePrevOrder(BTNode* root)
{if (root == nullptr)return;printf("%c ", root->_data);BinaryTreePrevOrder(root->_left);BinaryTreePrevOrder(root->_right);
}

可以根据图来看 

2、中序遍历:中序遍历是采用 左子树 - 根 - 右子树 的顺序遍历二叉树。

与前序遍历类似,每个结点都可以看作 根、左子树、右子树 三个部分

不同的是中序遍历是先向左探索,等到为空返回时,再记录当前结点,最后向右探索

代码如下: 

// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{if (root == nullptr)return;BinaryTreePrevOrder(root->_left);printf("%c ", root->_data);BinaryTreePrevOrder(root->_right);
}

 

3、后序遍历:后序遍历是采用 左子树 - 右子树 - 根 的顺序遍历二叉树。 

与前序和中序类似,后序是先向左探索,递归返回后向右探索,最后记录根

代码如下:

// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{if (root == nullptr)return;BinaryTreePrevOrder(root->_left);BinaryTreePrevOrder(root->_right);printf("%c ", root->_data);
}

 

二、层序遍历

层序遍历:和名字一样,就是一层一层遍历,如上图示例,层序遍历就是

                                                                                              1 2 3 4 5 6 7 8 9

操作方法:先用一个队列保存根结点,然后在出根节点的时候把它的左右不为空的孩子入队列,然后重复先出再入操作。每个父亲结点会在走之前会把自己的孩子都拉进队列(也就是当一层结点遍历完成后,其二层结点已经全部在队列里面了),所以在遍历过程中栈不会为空,栈为空就代表所有结点都遍历完成,结束循环。

代码如下: 

// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{queue<BTNode*> q;//队列q.push(root);//先入根节点while (!q.empty())//为空结束{BTNode* tmp = q.front();//取队头数据printf("%c ", tmp->_data);q.pop();//出if(tmp->_left)//把它的非空孩子拉进队列q.push(tmp->_left);if(tmp->_right)q.push(tmp->_right);}
}

三、计算结点个数

分治思想,把整棵树分为 根 - 左子树 - 右子树 ,结点个数就等于 左子树 + 右子树 + 1.

代码如下 :

// 二叉树节点个数
int BinaryTreeSize(BTNode* root)
{if (root == nullptr)return 0;int leftHeight = BinaryTreeSize(root->_left);int rightHeight = BinaryTreeSize(root->_right);return leftHeight + rightHeight + 1;
}

四、查找值为x的结点

查找值为x的结点,遍历查找,前中后序都可以,找到返回即可。

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == nullptr)return nullptr;if (root->_data == x)return root;BTNode* ret1 = BinaryTreeFind(root->_left, x);if (ret1)//如果找到了直接返回,没找到去右边找return ret1;return BinaryTreeFind(root->_right, x);
}

 

五、销毁二叉树

销毁二叉树:就是将二叉树的所有结点都free掉,也要遍历二叉树。

那该用前序中序还是后序呢?

前序是先将自己干掉,把自己干掉后就找不到左右孩子了,所以不行

中序是先把左子树干掉,再把自己干掉,自己没了就找不到右孩子了,也不行

后序是先把左右子树干掉,在释放自己,刚好符合我们的要求,所以就用后续

代码如下: 

// 二叉树销毁
void BinaryTreeDestory(BTNode** root)//传二级是为了把root置空
{if (*root == nullptr)return;BinaryTreeDestory(&(*root)->_left);BinaryTreeDestory(&(*root)->_right);free(*root);*root = nullptr;
}

感谢大家观看!!!


http://www.ppmy.cn/news/1117176.html

相关文章

容器中的nginx暴露一个端口部署多个功能的网站

随着容器的应用越来越多&#xff0c;将nginx部署在容器中也是常有之事。可能事先创建容器时只暴露了一个端口给浏览器连接&#xff0c;后面又想根据添加多个应用&#xff0c;根据URL的不同来访问不同的应用。比如在暴露了主机的83端口给nginx容器的80端口&#xff0c;原来只有一…

SpringCloud Alibaba 整合Sentinel的基本使用

文章目录 一、什么是Sentinel二、Sentinel 的主要特性1. 流量控制&#xff1a;2. 熔断降级&#xff1a;3. 实时监控&#xff1a;4. 规则配置&#xff1a;5. 集成方便&#xff1a; 三、Sentinel 分为哪几部分:1. 核心库&#xff08;Java 客户端&#xff09;2. 控制台&#xff08…

RISC-V架构学习——C语言内嵌汇编总结

1、C语言内嵌汇编的作用 &#xff08;1&#xff09;优化&#xff1a;对于特别重要代码进行优化&#xff0c;出于性能的考虑&#xff1b; &#xff08;2&#xff09;C语言需要借助汇编指令来实现特殊功能。比如&#xff1a;C语言中访问系统寄存器就需要借助CSR指令&#xff1b; …

泡泡玛特大火,潮玩行业如何利用软文推广出圈

随着经济的发展&#xff0c;各类潮玩创意落地、新产品层出不穷&#xff0c;也导致潮玩行业陷入了类目繁多&#xff0c;但是新品很难出圈的困境。泡泡玛特作为年轻人中十分受欢迎的品牌&#xff0c;紧跟消费浪潮&#xff0c;成为国内营销赛道上一个让人无法忽视的潮玩IP。那么潮…

aspose-words导出word方法

一、引用依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>19.5</version><classifier>jdk17</classifier></dependency>二、导出类 public class WordTable {//定…

高成本获客时代,企业如何通过营销自动化实现突围?

在数字化时代&#xff0c;随着市场竞争的不断升级&#xff0c;企业在获客方面面临了前所未有的挑战。不论是B端或C端的市场和运营部门纷纷寻求可降低获客成本的新运营路径&#xff0c;将有限的预算花在刀刃上。 企业迫切需要寻求更加智能和高效的方式来吸引、转化和留住潜在客…

华为华三40G带宽互通连接测试

郁闷了几天了&#xff0c;今天竟然做了件爽事&#xff01;慢慢说来。 今天下雨&#xff0c;下午娃上学&#xff0c;我送老婆去学校上课。之后到实验室&#xff0c;今年申请买的两台交换机正好送到&#xff1a; S5500V2-54S-EI&#xff1a;48个10/100/1000TX以太网端口&#x…

告白玫瑰||书信逐字打印效果

❝ 关注微信公众号「ClassmateJie」 更多惊喜等待你的发掘 ❞ 直接看实现效果 电脑端 手机端 使用场景 发给女神告白~ 提供一些文案 “自从遇见你&#xff0c;我的世界变得不一样了。每一天都因为你而变得特别。我想告诉你&#xff0c;我喜欢你&#xff0c;不仅仅是因为你的美丽…