题解 | #重建二叉树#

重建二叉树

http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6

import java.util.*;
/**
 * 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 [] vin) {
            //递归重建
            //先序遍历的第一个,肯定是根节点,
            //现需遍历的第二个,肯定是左节点的第一个根节点
            return reConstructBinaryTreeLeft(pre,vin);
    }
    //构建左子树
    public TreeNode reConstructBinaryTreeLeft(int [] pre,int [] vin){
         TreeNode root;
        //创建本级节点
        if(pre.length>0){
            root = new TreeNode(pre[0]);
        }else{
            root = null;
            return root;
        }
        //把先序和中序拆分开来
        int[] preLeft = new int[10] ;
        int[] vinLeft = new int[10] ;

        int[] preRight = new int[10] ;
        int[] vinRight = new int[10] ;
        boolean flag = false;
        int index = 0;
        for(int i = 0,j = 0;i<vin.length;i++,j++){
            if(flag){
                preRight[j]  = pre[i];
                vinRight[j]  = vin[i];
            }
            if(pre[0] == vin[i]){
                preLeft = new int[i];
                vinLeft = new int[i];
                preRight = new int[vin.length - i-1];
                vinRight = new int[vin.length - i-1];
                j = -1;
                index = i ;
                flag =true;
            }
        }
        for(int i = 0;i<index;i++){
            preLeft[i] = pre[i+1];
            vinLeft[i] = vin[i];
        }
        //判断是左子节点还是右子节点
        root.left = reConstructBinaryTreeLeft(preLeft,vinLeft);
        root.right = reConstructBinaryTreeLeft(preRight,vinRight);

        return root;
    }
    
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务