遍历方式
二叉树遍历分为前序遍历、中序遍历和后序遍历。(网上有很多相关资料,所以本文只会简单提一下,以便整篇内容的理解)
前序遍历
- 输出根节点
- 前序遍历左子树
- 前序遍历右子树
中序遍历
- 中序遍历左子树
- 输出根节点
- 中序遍历右子树
后序遍历
- 后序遍历左子树
- 后序遍历右子树
- 输出根节点
尝试根据结果结合不同的遍历方式重建二叉树
应该有人在面试时被问过:三种不同的遍历方式,取其中两种,哪种结合方式可以逆推出二叉树,哪种结合方式不能。
答案是:
- 前序 + 中序 √
- 中序 + 后序 √
- 前序 + 后序 ×
所以很多文章都说三种遍历方式中中序遍历更重要是有其道理的。
接下来我们根据测试用例分别根据三种不同的结合方式进行模拟。
测试用例:
- 前序输出:1 2 4 5 7 3 6
- 中序输出:4 2 7 5 1 3 6
- 后序输出:4 7 5 2 6 3 1
前序 + 中序
- 根据前序规则寻找根节点,可知根节点在数据第一位,为 1
- 根据中序规则可知,根节点左边数据为左子树、右边数据为右子树,所以得出左子树(4 2 7 5)根节点(1)右子树(3 6)
- 将 2 步得出的左子树和右子树分别进行 1、2 步的流程,最终即可确定一颗唯一的树
总结流程就是前序用来找根节点,中序用得到的根节点划分左右子树,递归得出二叉树。
中序 + 后序
- 根据后序规则寻找根节点,可知根节点在数据最后一位,为 1
- 根据中序规则可知,根节点左边数据为左子树、右边数据为右子树,所以得出左子树(4 2 7 5)根节点(1)右子树(3 6)
- 将 2 步得出的左子树和右子树分别进行 1、2 步的流程,最终即可确定一颗唯一的树
总结流程就是后序用来找根节点,中序用得到的根节点划分左右子树,递归得出二叉树。
前序 + 后序
区别于前两种组合,当前组合中的前序和后序可以确定二叉树的根,但都不能确定剩余数据是在左子树还是右子树中,导致无法逆推出一个唯一的树。
如下二叉树,都可以得出前序和后序满足的输出,但树不相同:
这是由于,当二叉树某个节点只有一个子节点的时候,无论这个节点是左子节点还是右子节点,对于前序和后序遍历的结果是没有影响的。
所以只根据前序 + 后序无法逆推出一个唯一的二叉树。
总结
本文简单描述了二叉树的三种遍历规则,并解释了为什么前序 + 中序、中序 + 后序可以逆推出唯一的二叉树,而前序 + 后序就不行,希望对你有所帮助。