重建二叉树

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

虽然效率低但好歹解出来了 🙃

感觉在纸上写的时候有思路但落实到代码就很尴尬😅

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 public class Solution {
11     public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
12         if(in.length==0){
13             return null;
14         }
15         if(in.length==1){
16             return new TreeNode(in[0]);
17         }else{
18             int pl = pre.length;
19             int il = in.length;
20             TreeNode THead = new TreeNode(pre[0]);
21             int nodeindex = location(pre[0],in);
22             int[] tpreleft = new int[nodeindex];//去掉根节点的左子树前序遍历
23             int[] tpreright = new int[pl-nodeindex-1];//右子树前序遍历
24             int[] tinleft = new int[nodeindex];//左子树中序遍历
25             int[] tinright = new int[il-nodeindex-1];//右子树中序遍历
26             if(nodeindex!=0){
27                 for(int i=0;i<nodeindex;i++){
28                     tpreleft[i] = pre[i+1];
29                 }
30                 for(int k=0;k<nodeindex;k++){
31                     tinleft[k] = in[k];
32                 }
33             }
34             if((pl-nodeindex-1)!=0){
35                 for(int j=0;j<pl-nodeindex-1;j++){
36                     tpreright[j] = pre[(j+nodeindex+1)];
37                 }
38                 for(int l=0;l<in.length-nodeindex-1;l++){
39                     tinright[l] = in[l+nodeindex+1];
40                 }
41             }
42             THead.left = reConstructBinaryTree(tpreleft,tinleft);//递归获得左子树
43             THead.right = reConstructBinaryTree(tpreright,tinright);//递归获得右子树
44             return THead;
45         }
46     }
47     public int location(int key,int[] in){/*获取根节点在中序遍历中的位置,以此分辨左子树和右子树*/
48         int l = in.length;
49         for(int i=0;i<l;i++){
50             if(key==in[i])
51                 return i;
52         }
53         return -1;
54     }
55 }

 

下面贴一下推荐代码(简洁)

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;
    }
}

思路大体上差不多虽然本人实现很复杂。。。

继续加油

posted @ 2019-12-26 14:36  hu啦啦啦  阅读(272)  评论(0编辑  收藏  举报