剑指offerNo4. 重建二叉树(Java)

题目描述:

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

思路:

前序顺序:(中左右),中序顺序:(左中右),后序顺序:(左右中)

如题中,

前序遍历序列{1,2,4,7,3,5,6,8},可以得出1为树的根。从中序遍历序列{4,7,2,1,5,3,8,6}可以得出{4,7,2}是以1为根的树的左子树,{5,3,8,6}是以1为根的右子树。

同理,通过前序序列{2,4,7}可以得出2为左子树的根部,通过中序序列{4,7,2}可以得出{4,7}为以2为根部的树的左子树,可以看出以2为根部的树没有右子树。递归进行就可,其它都是同理。

代码:

package offer;

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

    public static void main(String[] args) {


    }
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre == null || in == null || pre.length != in.length||pre.length<1){
           return null;
        }
        //递归调用
        TreeNode root = reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
        return root;
    }
    private static TreeNode reConstructBinaryTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){
        if(startPre >endPre || startIn > endIn){
            return null;
        }
        //根节点为前序序列数组的第一个元素
        TreeNode root = new TreeNode(pre[startPre]);
        for(int i = 0;i<=endIn;i++){
            //根据前序遍历得到的根节点在中序遍历中查找根节点的下标i
            if(pre[startPre] == in[i]){
                //进行递归调用
                root.left = reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
                root.right= reConstructBinaryTree(pre,startPre+i-startIn+1,endPre,in,i+1,endIn);
                break;
            }
        }
        return root;
    }
}
发布了46 篇原创文章 · 获赞 11 · 访问量 3568

猜你喜欢

转载自blog.csdn.net/qq_40664693/article/details/104330681