1.遍历二叉树
1、遍历二叉树的算法描述
遍历二叉树是指按某条搜索路径巡访树中每一个节点,使得每一个节点都被访问一次,而且仅被访问一次。
二叉树的定义本质是递归定义的
遍历的实质是对二叉树进行线性化,即遍历的结果是将非线性结构树中的节点排列成一个线性序列--得到树中所有节点的一个线性排列
2.先序遍历(DLR)
- 访问根节点
- 先序遍历左子树
- 先序遍历右子树
如图所示:
先序遍历的算法描述:
3.中序遍历(LDR)
- 中序遍历左子树
- 访问根节点
- 中序遍历右子树
4.右序遍历(LRD)
- 右序遍历左子树
- 右序遍历右子树
- 访问根节点
如图所示:
5、三者之间的比较
先序遍历、中序遍历、后序遍历三种遍历之间的算法分析
6.三种遍历算法的分析
时间复杂度和空间复杂度
2.根据遍历序列确定二叉树
- 若二叉树各节点的值均不相同,则二叉树节点的先序序列、中序序列和后序序列都是唯一的
- 由二叉树的先序序列和中序序列,或者由二叉树的后序序列和中序序列可以唯一确定唯一的一棵二叉树
注意:
先序序列和后序序列是不能确定唯一的二叉树的,可以理解为我们可以把中序序列当做一个桥梁,没有中序序列的帮助我们是过不了河的。
已知先序序列和中序序列如何确定唯一的二叉树呢
思路:
根据先序遍历的方法(根左右DLR)先访问根节点,后依次访问左子树和右子树,根据先序遍历我们可以确定A是二叉树的最高根节点,根据中序遍历(LDR)先访问左子树、依次访问根节点和右子树,由此我们确定
CDBF是A根节点的左子树
IHGJ是A根节点的右子数
根据先序遍历,我们可以确定 B是A根节点的左子树;由此根据中序遍历我们可以再次筛选得出
CD是B根节点的左子树
FE是B根节点的右子树
同理通过先序遍历我们可以确定C是B根节点的根,因为根左右,B是根节点,自然C就是B根节点的节点,已知C是D的根节点了,根据中序遍历(左根右)可知D是C的右子树
同样的:由先序可知,E是B根节点的节点,根据中序可知,F是E的左子树,由此A的左子树已经确定好了,这时候开始访问A根节点的右子树
由先序编列,可以明确确定G是A的右子树,根据中序得出
IH是G的左子树
J是G的右子树 根据先序遍历(根左右)可以确定H是G根节点的节点,同时根据中序遍历清晰得出I是H根节点的左子树(左根右),由此到这里一个完整的二叉树就确定好了
已知后序序列和中序序列如何确定唯一的二叉树呢
思路和上面的类似,仔细推就可以推出来。