二叉树的确定

二叉树的四种遍历方法

  1. 先序遍历(根左右):可以想象为,一个小人以一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果。

遍历结果:A B D H I E J C F K G

动图演示

  1. 中序遍历(左根右):可以看成,二叉树每个节点,垂直方向投影下来(可以理解为每个节点从最左边开始垂直掉到地上),然后从左往右数,得出的结果便是中序遍历的结果。

遍历结果:H D I B E J A F K C G

动图演示

3.后序遍历(根左右):按照先序遍历的路径把一串葡萄剪成一个一个的,遇到能剪下来的就把它剪下来。

遍历结果:H I D J E B K F G C A

动图演示

4. 层次遍历:从上到下 从左到右

遍历结果:A B C D E F G H I J K

图片展示

确定二叉树的两种方式:

(1)先序+中序

(2)后序+中序

现假设存在一棵二叉树,其先序、中序和后序遍历的结果如下:

先序遍历:ABDEGCFH

中序遍历:DBGEACFH

后序遍历:DGEBHFCA

在介绍如何利用遍历方式唯一确定一棵二叉树之前,需要重点强调:无论利用什么方式来唯一确定一棵二叉树,其本质都是通过两种遍历结果来不断递归地确定根结点和划分左右子树的过程!

先序遍历+中序遍历

先序遍历+中序遍历的要义是:利用先序遍历确定根结点,再利用中序遍历划分左右子树

步骤一:分析整棵二叉树

对于先序遍历,其遍历方式是一个结点需要先访问自己,再访问其左子树,接着才是其右子树,故先序遍历结果中的第一个元素一定是根结点,根据上述先序遍历可以知道是A。 接着利用得到的A,在中序遍历结果中找到A所在的位置,然后便可以将A左侧的所有元素归属到根结点的左子树,A右侧的所有元素归属到根结点的右子树,而之所以这样做,是因为对于中序遍历,其遍历方式是一个结点先访问其左子树,再访问自己,接着才是其右子树,所以A前面的元素一定来自A的左子树,A后面的一定来自A的右子树。 根据上述分析,可以先画出如下图片:

步骤二:分析A的左子树,即包含DBGE的这棵二叉树。

这时可以把包含DBGE这四个元素的先序遍历部分和中序遍历部分单独提取出来:

部分先序遍历:BDEG

部分中序遍历:DBGE

现在单独观察包含DBGE的这棵树和它对应的部分先序遍历、部分中序遍历,可以看到接下来的分析方式又与步骤一是一模一样的了,即先确定这个树(仅包含DBGE的这棵树)的根结点,再确定它的两棵子树,现在根结点是部分先序遍历的第一个元素,即B,根据B,在部分中序遍历中划分左右子树,即左子树包含D,右子树包含GE,得到的图片如下:

可以看到这时B的左子树只有一个结点,所以可以认为已经确定好了,那么就只需要按照步骤一的方式对B的右子树进行同样的分析即可。

步骤三:分析A的右子树,即包含CFH的这颗二叉树。

这时可以把包含CFH这三个元素的先序遍历部分和中序遍历部分单独提取出来:

部分先序遍历:CFH

部分中序遍历:CFH

现在单独观察包含CFH的这棵树和它对应的部分先序遍历、部分中序遍历,可以看到接下来的分析方式又与步骤一是一模一样的了,即先确定这个树(仅包含CFH的这棵树)的根结点,再确定它的两棵子树,现在根结点是部分先序遍历的第一个元素,即C,根据C,在部分中序遍历中划分左右子树,即左子树为空,右子树包含FH,得到的图片如下:

可以看到这时C的左子树没有一个结点,所以可以认为已经确定好了,那么就只需要按照步骤一的方式对C的右子树进行同样的分析即可。

步骤四:得到一颗完整的二叉树。

根据上述步骤,完整地走一遍流程,便可以得到如下的一棵二叉树:

后序遍历+中序遍历

后序遍历+中序遍历的要义是:利用后序遍历确定根结点,再利用中序遍历划分左右子树\n\n其实后序遍历+中序遍历唯一确定一棵二叉树的方法与先序遍历+中序遍历唯一确定一棵二叉树的方法本质上是一样的,唯一不同在于,利用后序遍历+中序遍历唯一确定一棵二叉树的方法在每次确定根结点时,需要对后序遍历的结果从后往前看,比如对于上述例子中的后序遍历:DGEBHFCA,第一步确定根结点时,需要取最后一个元素,因为后序遍历是最后才访问根结点,所以此时根结点的位置就是最后一个,而其他步骤就与先序遍历+中序遍历唯一确定一棵二叉树的方法是一样的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值