题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点。 

剑指Offer-重构二叉树


解题思路;

在二叉树的前序遍历序列中,第一个数字总是树的根结点的值。但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边。因此我们需要扫描中序遍历序列,才能找到根结点的值。

  前序遍历序列的第一个数字1就是根结点的值。扫描中序遍历序列,就能确定根结点的值的位置。根据中序遍历特点,在根结点的值1前面的3个数字都是左子树结点的值,位于1后面的数字都是右子树结点的值。

  在二叉树的前序遍历和中序遍历的序列中确定根结点的值、左子树结点的值和右子树结点的值的步骤如下图所示:

剑指Offer-重构二叉树

  分别找到了左、右子树的前序遍历序列和中序遍历序列,我们就可以用同样的方法分别去构建左右子树。换句话说,这是一个递归的过程。

思路总结:先根据前序遍历序列的第一个数字创建根结点,接下来在中序遍历序列中找到根结点的位置,这样就能确定左、右子树结点的数量。在前序遍历和中序遍历的序列中划分了左、右子树结点的值之后,就可以递归地去分别构建它的左右子树。

通过代码:
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        return ConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
    }
    
    public TreeNode ConstructBinaryTree(int[] pre,int startPre,int endPre,int[] in,int startIn , int endIn){
        int rootval = pre[startPre];
        TreeNode root = new TreeNode(rootval);
        if(startPre == endPre && startIn==endIn && pre[startPre]==in[startIn]){
            return root;
        }
        int rootInOrder = startIn;
        while(in[rootInOrder]!=rootval && rootInOrder <= endIn){
            rootInOrder++;
        }
        int leftPreLength = rootInOrder - startIn;
        int leftPreEnd = startPre + leftPreLength;
        if(leftPreLength>0){
            root.left = ConstructBinaryTree(pre,startPre+1,leftPreEnd,in,startIn,rootInOrder-1);
        }
        
        if(leftPreLength<endPre-startPre){
            root.right = ConstructBinaryTree(pre,leftPreEnd+1,endPre,in,rootInOrder+1,endIn);
        }
        return root;
    }
}

相关文章:

  • 2021-11-30
  • 2021-08-06
  • 2021-03-31
  • 2021-11-04
  • 2021-07-02
  • 2022-01-01
猜你喜欢
  • 2021-12-22
  • 2021-05-23
  • 2021-08-08
  • 2021-11-10
  • 2022-01-13
  • 2021-07-14
  • 2021-10-01
相关资源
相似解决方案