c++层次遍历_动画:二叉树遍历的多种姿势

前言

在《什么是二叉树》中,我们介绍了二叉树的创建(插入),查找和删除,本文将介绍二叉树的遍历。而二叉树遍历有多种形式,他们也可以应用在不同的场景中,常见的深度优先遍历方式有前序遍历,中序遍历,后序遍历,而不常用广度优先遍历方式有层次遍历。本文将会对以上遍历方式都进行介绍。

二叉树的遍历

常见遍历顺序有以下几种:

  • 前序遍历,先检查节点值,然后递归遍历左子树和右子树
  • 中序遍历,先遍历左子树,然后检查当前节点值,最后遍历右子树
  • 后序遍历,先递归遍历左右子树,然后检查当前节点值
  • 层次遍历,如名字所言,从第一层开始,一层一层往下遍历

以下图为例,我们一一介绍四种遍历方式。

3d3b481427aca52cac39c3a826682ab2.png

前序遍历

  • 输出当前节点值10,然后输出左子树,最后输出右子树;
  • 对于其左子树来说,同样以这样的顺序,则先输出5,然后输出左子树4,最后输出右子树8;
  • 对于其右子树,同样以这样的顺序,则先输出19,然后输出左子树13,最后输出右子树24;
  • 最终得到前序遍历输出为:10,5,4,8,19,13,24。

fad6cd486bd00ee5403c32cba3bea902.gif

前序遍历代码:

void 

中序遍历:

  • 先输出左子树,然后输出当前节点10,最后输出右子树;
  • 对于其左子树来说,同样以这样的顺序,则先输出左子树4,然后输出节点值5,最后输出右子树8;
  • 对于其右子树,同样以这样的顺序,则先,输出左子树13,然后输出节点值19,最后输出右子树24;
  • 最终得到中序遍历输出为:4,5,8,10,13,19,24。

f830850cee8cf4fe1b1719dadfdbf41f.gif

我们发现二叉查找树的中序遍历输出就是排序后的结果。还记得吗,二叉查找树也叫二叉搜索树或者二叉排序树。

中序遍历代码:

void 

后序遍历

  • 先输出左子树,然后输出右子树,最后输出节点值10
  • 对于其左子树来说,同样以这样的顺序,则先输出左子树4,然后输出右子树8,最后输出节点值5;
  • 对于其右子树,同样以这样的顺序,则先,输出左子树13,然后输出右子树24,最后输出节点值19
  • 最终得到后序遍历输出为:4,8,5,13,24,19,10

df2d1f61dc5fc571ea69f38dbd10597a.gif

后序遍历代码:

void 

层次遍历

  • 遍历第一层,输出10
  • 遍历第二层,输出5,19
  • 遍历第三层,输出4,8,13,24

虽然看起来过程很简单,但是代码实现却不能像前面三种深度优先遍历方式那样直接使用递归,它更好的方式是借助一个具有先入先出特点的队列(队列可参考队列-C语言实现)。以三个节点为例,我们先将根节点入队,然后分别入队左右孩子节点,最后输出队列内容,那么它的顺序就是层次遍历的顺序了。

头结点入队:

10

输出,队头元素10,并将它的左右孩子5,19入队:

519

输出队头元素5,并将它的左右孩子4,8入队:

1948

输出队头元素19,并将它的左右孩子13,24入队:

481324

由于队列中的元素都没有孩子节点,因此都直接出队,输出4,8,13,24

最终得到的输出顺序为:10,5,19,4,8,13,24.

90a5c4537ef7aed37daef708653cfcb2.gif

关键代码如下:

void 

完整可运行代码

完整代码较长,请访问:traversal.c
运行结果:

insert 10 to tree
insert 5 to tree
insert 19 to tree
insert 4 to tree
insert 8 to tree
insert 13 to tree
insert 24 to tree

层次遍历:10 5 19 4 8 13 24 
前序遍历:10 5 4 8 19 13 24 
后序遍历:4 8 5 13 24 19 10 
中序遍历:4 5 8 10 13 19 24

思考

前面三种遍历方式都是直接printf输出,如果需要遍历返回一个数组呢?该如何实现?难点在哪?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值