剑指Offer:重建二叉树【7】

剑指Offer:重建二叉树【7】

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

分析

我们首先要明白前序和中序构建二叉树的流程,流程理解了才是解题的关键:

如上图所示,前序遍历可以找到头结点,然后在中序遍历中找到它的位置

比如,1的位置为i,那么startIn~i-1就是它的左子树的中序遍历startPre+1~startPre+i-startIn就是它的左子树的前序遍历

那么,右子树的的中序遍历是 i+1~endIn,startPre+i-startIn+1~endPre是先序

有了这一点以后,我们根据这个分解问题,发现他可以被对递归执行。每次的先序遍历的startPre都是头节点,然后中序帮助划分,再拿先序的startPre作为头结点,一直继续下去,就可以构建出完整的二叉树。

Java实现代码

package tree;

public class BuildTree {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root=ConstructCore(pre,0,pre.length-1,in,0,in.length-1);
        return root;
    }

    public TreeNode ConstructCore(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn)
    {
        if(startPre>endPre||startIn>endIn)
            return null;
        TreeNode node = new TreeNode(pre[startPre]);
        for(int i=startIn;i<=endIn;i++)
        {
            if(in[i]==pre[startPre])
            {
                node.left = ConstructCore(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
                node.right =ConstructCore(pre,startPre+i-startIn+1,endPre,in,i+1,endIn);
                break;
            }
        }
        return node;

    }
}

class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;
     TreeNode(int x) { val = x; }
 }

  

猜你喜欢

转载自www.cnblogs.com/MrSaver/p/9205436.html