Skip to content

Latest commit

 

History

History
31 lines (23 loc) · 2.1 KB

04剑指offer06.md

File metadata and controls

31 lines (23 loc) · 2.1 KB

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历都不含重复的数字。重建二叉树后输出该二叉树的后续遍历。

在线测试平台:http://ac.jobdu.com/problem.php?pid=1385


前序遍历和终须遍历的特点

  • 前序遍历的列表中,第一个数字总是树的根节点。后面的m和数字是其左子树的组成部分,剩下最后的数字则是其右子树的组成部分。
  • 中序遍历的列表中,根节点可以在任意的位置。但是根结点左侧所有的数字都属于其左子树,根节点的右侧都属于其右子树。

方法分析

  • 我们可以通过前序遍历序列知道当前树的根节点,然后通过中序遍历序列找到这个根节点。
  • 中序遍历中左侧的数为该树的左子树,右侧为该树的右子树,统计左子树和右子树的个数分别为m和n。
  • 前序遍历序列第一个元素后面的m个元素即为该树的左子树,最后剩下的n个元素即为该树的右子树。
  • 通过上述的步骤我们就得到了:
    • 该树左子树的前序遍历序列和中序遍历序列,这两个序列确定的树的根节点即为目前该树的左子结点。
    • 该树右子树的前序遍历序列和中序遍历序列,这两个序列确定的树的根节点即为目前该树的右子节点。
  • 不断的递归上述步骤,直至前序遍历序列和后续遍历序列只有一个节点。

上面步骤的主要思想,就是通过前序遍历找根节点,根据中序遍历统计左子树和右子树的元素的个数。利用统计的个数来将两组遍历序列分别拆分为左子树的遍历序列和右子树遍历序列,不断的拆分知道序列中只有一个元素。


注意事项

  • 注意回收内存
  • 注意两组遍历序列不能重建二叉树的情况:
    • 两个遍历序列个数不一样
    • 两个遍历序列都只剩下一个元素,但是不相等
    • 在后续遍历中找不到前序遍历中的根节点