LeetCode之重建二叉树

题目描述

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

  • 我的答案

    public class Solution {
        public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
            if(pre[0]==0) return null;
            int root = pre[0];
            TreeNode rootNode = new TreeNode(root);
            int index=0;
            while(in[index]!=root){
                index++;
            }
           int[] preL = new int[index>0?index:1];
            int[] preR = new int[(in.length - 1 - index)>0?(in.length - 1 - index):1];
            int[] inL = new int[index>0?index:1];
            int[] inR = new int[(in.length - 1 - index)>0?(in.length - 1 - index):1];
    
        for (int j = 1; j <= index; j++) {
                preL[j - 1] = pre[j];
                inL[j - 1] = in[j - 1];
            }
            for (int i = 0; i <(in.length - 1 - index) ; i++) {
                preR[i] = pre[index + i+1];
                inR[i] = in[index + i+1];
            }
            rootNode.left = reConstructBinaryTree(preL,inL);
            rootNode.right= reConstructBinaryTree(preR,inR);
            return rootNode;
    
        }
    }
    

     

  • 标准

    链接:https://www.nowcoder.com/questionTerminal/8a19cbe657394eeaac2f6ea9b0f6fcf6
    来源:牛客网
    
    public class Solution {
        public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
            TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
            return root;
        }
        //前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}
        private 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=startIn;i<=endIn;i++)
                if(in[i]==pre[startPre]){
                    root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
                    root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
                          break;
                }
    
            return root;
        }
    }