文章目录
- 二叉树的存储结构
- 二叉树的顺序存储
- 二叉树的链式存储
- 小结
- 二叉树的先中后序遍历
- 例题
- 小结
- 二叉树的层次遍历
- 小结
- 由遍历序列构造二叉树
- 一个遍历序列即使给定了前中后序,也不能确定该二叉树的形态
- 可以确定的序列组合
- 前序+中序
- 后序+中序
- 层序+中序
- 小结
- 若前序,后序,层序两两组合能吗?
- 树的存储结构
- 总览
- 树的逻辑结构
- 顺序存储(双亲表示法)
- 顺序+链式存储(孩子表示法)
- 链式存储(孩子兄弟表示法)
- 森林和二叉树的转换(孩子兄弟表示法)
- 小结
- 树和森林的遍历
- 树的先根遍历
- 树的后根遍历
- 树的层次遍历
- 森林的先序遍历
- 森林的中序遍历
- 小结
二叉树的存储结构
二叉树的顺序存储
i所在的层次可回顾上面二叉树的性质
通过计算出节点对应左孩子或右孩子的节点数然后判断是否在n个节点的范围内
当非完全二叉树时不适用了,如下图,节点与编号不对应了
所以,还是按照原来的对应图来存储。判断节点存不存在通过判断是否空的布尔值即可
弊端:会浪费部分节点
二叉树的链式存储
n个节点肯定会有n-1个指针域不为空,n+1个指针域为空。
n-1是有n-1条线连接两个节点,所以对应的指针域中也会有n-1个不为空的指针域
常用的操作
寻找某个节点的父节点时,需要遍历整个数,依次判断是否某个节点的子节点为对应的节点。
此时节点结构体中加上父节点指针可以避免遍历
小结
二叉树的先中后序遍历
感觉先中后序主要是根的遍历位置在前中后
有点递归的思想在里面
先找到根,然后开始按对应的序遍历,如果左右中存在不是叶子节点,则将该节点当作根节点继续按对应的序来遍历
例题
小结
二叉树的层次遍历
核心:队列非空则头节点出队并访问该节点且将其左,右孩子插入队尾(判断是否有,有的话则插入)
小结
由遍历序列构造二叉树
一个遍历序列即使给定了前中后序,也不能确定该二叉树的形态
可以确定的序列组合
前序+中序
后序+中序
都是先判断根结点
层序+中序
小结
核心:找根节点
若前序,后序,层序两两组合能吗?
无法确定,一定要有中序才行
树的存储结构
总览
树的逻辑结构
顺序存储(双亲表示法)
顺序+链式存储(孩子表示法)
存在指向孩子链表的指针的元素
链式存储(孩子兄弟表示法)
左孩子都是原本的孩子节点,右孩子都是原本的兄弟节点
所以B的右孩子的遍历下去的所有右孩子为原来A节点的孩子
森林和二叉树的转换(孩子兄弟表示法)
把兄弟节点都连起来,然后把兄弟节点与父节点的连线断了就成了
小结
树和森林的遍历
树的先根遍历
类似二叉树的先序遍历 根 左 右
对应的二叉树即对应的孩子兄弟法表示的树且该二叉树的先序遍历与原树的先根遍历相同
树的后根遍历
类似二叉树的后序遍历 左 右 根
对应的二叉树即对应的孩子兄弟法表示的树且该二叉树的中序遍历与原树的后根遍历相同
树的层次遍历
后根和先根遍历为深度优先遍历
层次遍历为广度优先遍历
森林的先序遍历
或把森林先转化为二叉树
森林的中序遍历
或转换为二叉树