105. 从前序与中序遍历序列构造二叉树

1. 一开始蒙了,完全没思路。然后看了一下官方题解视频,提到用递归,而preorder头部都是root。就继续自己想了一下,写出来了。

2. 主要是前序和中序遍历的特点。前序递归提供root,中序递归提供left和right,其他就是一下简单计算。分治法。

3. 还有个问题,如果题目里面数字不重复去掉呢? 想了一下,还是可以用这种方法,不过hash出来两个index,选择前面那个就可以。具体可以hash的value为list。

4. 执行用时:2 ms ,超过98%;内存消耗:40.1 MB,超过67%;


class Solution {

    Map mapIn = new HashMap();

    public TreeNode buildTree(int[] preorder, int[] inorder) {

        for(int i = 0; i < inorder.length; i++){

            mapIn.put(inorder[i], i);

        }

        return buildTreeHelp(inorder,0, inorder.length-1, preorder, 0);

    }

    public TreeNode buildTreeHelp(int[] inorder, int left,int right,  int[] preorder,int index){

        if(right

            return null;

        }

        TreeNode root = new TreeNode(preorder[index]);

        int tempIndex = mapIn.get(preorder[index]);

        root.left = buildTreeHelp(inorder, left,tempIndex-1,preorder,index+1 );

        root.right = buildTreeHelp(inorder,tempIndex+1, right, preorder, index + tempIndex-left +1);

        return root;

    }

}

你可能感兴趣的:(105. 从前序与中序遍历序列构造二叉树)