《大话数据结构》--遍历二叉树、树和森林

二叉树的遍历:是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

二叉树的遍历方法

前序遍历

先访问根结点,然后前序遍历左子树,再前序遍历右子树,如下图,遍历的顺序为:ABDGHCEIF
总结:从上而下依次访问左子树,对于右子树比如下图中的H,I, F可以认为越靠左越优先
在这里插入图片描述
前序遍历过程:

  1. 访问根结点 T T T,根结点 T T T不为null, 打印字母 A A A
  2. 访问 A A A的左孩子,不为null,执行显示字母 B B B
  3. 访问 B B B的左孩子,执行显示字母 D D D
  4. 访问 D D D的左孩子,执行显示字母 G G G
  5. 访问 G G G的左孩子,此时因为 G G G没有左孩子,再次访问 G G G结点的右孩子, G G G结点无右孩子
  6. 访问 D D D的右孩子,执行显示字母H
  7. 访问 H H H的左孩子,此时因为 H H H没有左孩子,再次访问 H H H结点的右孩子, H H H结点无右孩子
  8. 访问 B B B的右孩子, B B B结点无右孩子
  9. 访问 A A A结点的右孩子,打印字母 C C C
  10. 访问 C C C 结点的左孩子,打印字母 E E E
  11. 访问 E E E的左孩子, E E E结点无左孩子,访问 E E E的右孩子,打印字母 I I I
  12. 访问 I I I的左孩子,此时因为 I I I没有左孩子,再次访问 I I I结点的右孩子, I I I结点无右孩子
  13. 访问结点 C C C的右孩子,打印字母 F F F
  14. 访问 F F F的左孩子,此时因为 F F F没有左孩子,再次访问 F F F结点的右孩子, F F F结点无右孩子,返回

中序遍历

从最后一层的左边根结点开始(并不是先访问根结点),先遍历根结点的左子树,然后访问根结点,最后遍历右子树,如下图,遍历的顺序为: GDHBAEICF
在这里插入图片描述
中序遍历过程

  1. 判定根结点不为null, 访问根结点 A A A的左孩子 B B B,当前指针不为null,继续访问 B B B结点的左孩子 D D D,指针不为null,继续访问 D D D的左孩子 G G G,访问 G G G的左孩子,发现当前指针为null,于是返回,打印当前结点G
  2. 打印结点D
  3. 于是访问 D D D的右孩子 H H H,访问 H H H的左孩子, H H H没有左孩子,打印字母 H H H,继续访问 H H H的右孩子, H H H没有右孩子
  4. 打印结点 B B B,继续访问结点 B B B的右孩子,结点 B B B无右孩子
  5. 打印结点 A A A,访问结点 A A A的右孩子 C C C,访问结点 C C C的左孩子,指针不为空
  6. 访问结点 E E E,访问结点 E E E的左孩子,指针为null,打印结点 E E E,继续访问结点 E E E的右孩子 I I I I I I无左孩子,打印结点 I I I,再访问结点 I I I的右孩子,为null
  7. 打印结点 C C C, 访问结点 C C C的右孩子, F F F无左孩子,打印结点 F F F,再访问结点 F F F的右孩子,为null,返回

后序遍历

从左到右先叶子结点后结点的方式遍历访问左右子树,最后访问根结点,如下图,遍历的顺序为:GHDBIEFCA
在这里插入图片描述
后续遍历过程

  1. 访问根结点 A A A,根结点不为null, 访问根结点的左孩子 B B B,当前指针不为null,继续访问结点 B B B的左孩子 D D D,当前指针不为null,访问结点 G G G,继续访问 G G G结点的左孩子,指针为null,访问结点 G G G的右孩子,指针为null,打印结点 G G G
  2. 访问结点 D D D的右孩子, H H H无左、右孩子,打印结点 H H H
  3. 打印子树的根结点 D D D
  4. 访问结点 B B B的右孩子,指针为null,打印结点 B B B
  5. 访问结点 A A A的右孩子,继续访问 C C C的左孩子,再访问结点 E E E的左孩子,指针为null,访问结点 E E E的右孩子,访问结点 I I I的左、右孩子,均为空,打印结点 I I I
  6. 打印结点 E E E
  7. 访问结点 C C C的右孩子,指针不为null,访问结点 F F F F 为 左 右 孩 子 F为左右孩子 F,打印结点 A A A

层序遍历

从树的第一层,也就是树的根结点开始访问,从上而下逐层遍历,在同一层,按从左到右的顺序对结点逐个访问,如下图,访问的顺序为:ABCDEFGHI
在这里插入图片描述

树的遍历

如图,对于树
在这里插入图片描述

  • 先根遍历,即先访问树的根结点,然后依次遍历树的每棵子树,上图的先根遍历序列为:ABEFCDG
  • 后根遍历,即先依次后根遍历每棵子树,然后再访问根结点。上图后根遍历序列为:EFBCGDA

森林的遍历

  • 先根遍历:先访问森林中第一棵树的根结点,然后依次先根遍历根的每棵子树,依次用同样方式遍历剩余的树,然后依次拼接
  • 后根遍历:先访问森林第一棵树,后根遍历每棵子树,然后再访问根结点,再用同样方式遍历剩余树
    在这里插入图片描述
    对于上面的三棵树,先根遍历的结果是ABCDEFGHJI, 后根遍历的结果是BCDAFEJHIG,二叉树与森林的转化
    可知,上图对应的二叉树为
    在这里插入图片描述
    通过分析可以发现,森林的先根遍历与二叉树的前序一致,森林的后根遍历与二叉树的中序遍历一致,那么当二叉树作为树的结构存储时,树的先根遍历和后根遍历可以借用二叉树的前序遍历和中序遍历的算法实现。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值