5.22——105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
 
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
    3
   / \
  9  20
     /  \
   15   7
 
 
1.解题思路
对于任意一颗树而言,前序遍历的形式总是[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
即根节点总是前序遍历中的第一个节点。而中序遍历的形式总是[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
 
这道题的重点在于:上述形式中的所有左右括号进行定位。每次递归都能找到左子树的节点个数是能否解对这道题的关键。
    ①左子树片段范围:
        先序序列:pre[1] ~ pre[1 + 左子树的节点个数]
        中序序列:mid[0] ~ mid[左子树的节点个数]
    ②右子树片段范围:
        先序序列:pre[1 + 左子树的节点个数] + 1 ~ pre[-1]
        中序序列:mid[左子树的节点个数 + 1] ~ mid[-1]
下面代码中 h[root] - mids 即为左子树的节点个数
 
2.源码
posted @ 2020-05-24 19:16  xiaoqichaoren  阅读(159)  评论(0)    收藏  举报