邓公数据结构C++语言版学习笔记——二叉树

二叉树的遍历

在这里插入图片描述

一. preorder——先序遍历VLR

1. 递归先序遍历
在这里插入图片描述
2. 迭代先序遍历
在这里插入图片描述
在这里插入图片描述
3.先序遍历图解
在这里插入图片描述
在这里插入图片描述

二. inorder——先序遍历LVR

1. 递归中序遍历
在这里插入图片描述
2.迭代中序遍历
在这里插入图片描述

3.迭代中序遍历优化空间复杂度
<1>定义直接后继
在这里插入图片描述

<2>借用直接后继优化算法在这里插入图片描述
解释
① backtrack相当于将原辅助栈换成一个标志位。
② 每当抵达一个节点,借助该标志即可判断此前是否刚做过一次自下而上的回溯。若不是,则按照中序遍历的策略优先遍历左子树。反之,若刚发生过一次回溯,则意味着当前节点的左子树已经遍历完毕(或等效地,左子树为空),于是便可访问当前节点,然后再深入其右子树遍历。
③ 每个节点被访问之后,都应转向其在遍历序列中的直接后继。
④ 检查右子树是否为空判断后继位置:如果非空则后继在右子树,否则后继为某一祖先(回溯)。

4.迭代中序遍历进一步优化
在这里插入图片描述

5.中序遍历图解
在这里插入图片描述在这里插入图片描述

三. postorder——后序遍历LRV

1. 递归后序遍历
在这里插入图片描述
2.迭代后序遍历
将树T画在二维平面上,并假设所有节点和边均不透明。于是从左侧水平向右看去,未被遮挡的最高叶节点v——称作最高左侧可见叶节点(HLVFL)——即为后序遍历首先访问的节点
下面的代码寻找最高左侧可见叶节点
在这里插入图片描述
在这里插入图片描述
后序遍历步骤:
① 访问当前节点。 ② 遍历以其右兄弟(若存在)为根的子树。③ 向上回溯至其
父节点(若存在)并转入下一片段

3.后序遍历图解
在这里插入图片描述
在这里插入图片描述

四.levelorder——层次遍历

1. 算法实现
在这里插入图片描述
2. 层次遍历图解
在这里插入图片描述

总结

二叉树遍历用到了栈(stack)和队列(quene)这两个数据结构使得代码优化(从递归到迭代的空间优化
这几天看了二叉树,感觉迷迷糊糊(差的还很远),暂且能把代码看明白(让我写感觉差的太远了)而且已经开学了只能抽时间看看这些东西,所以赶快把一些自己感觉有用的东西记下来方便以后复习,同时也供大家一起学习(如果有错误麻烦指出来共同进步)。以上代码全是图片(自己本来想这照着写一遍,发现还是有点难度,所以先记下来以后抽空写一下)图片全部来源于邓俊辉老师的《数据结构C++语言版》

猜你喜欢

转载自blog.csdn.net/Fighting_Peter/article/details/104490114