leetcode106 根据中序数组和后序数组来构造二叉树

74 阅读1分钟

这一道题很像leetcode105题,同样可以使用dfs和迭代解题,但是说实话遍历比较复杂,就掌握一下dfs也就差不多了。

DFS具体思路,是利用后序遍历来确定每一个子树的根节点,中序遍历确定左右子树,然后再进行不断DFS,直到不能分成左右子树就可以了。

具体解题:如果你做过105题的话,那么这道题就很简单了,因为其实思路差不多,只需要稍微变通一下即可。首先就是根据后序遍历的特性反向遍历数组寻找根节点,然后将该数值在中序数组中进行查找(或者可以使用hashmap进行保存数值及其下标空间换时间的办法减少时间复杂度),然后保存中序数组对应根结点值的下标位置i_root_index,然后就是分别dfs左子树和右子树,最后返回node即可(具体细节看代码)。

 Map<Integer,Integer> map = new HashMap<>();
 private TreeNode DFSBuildTree(int p_start, int p_end, int[] preorder, int i_start, int i_end, int[] inorder,Map<Integer,Integer> hashMap){
        if (p_start == p_end) return null;
        TreeNode node = new TreeNode(preorder[p_start]);
        int i_root_index = hashMap.get(node.val);
//        int i;
//        for (i = i_start; i <i_end ; i++) {
//            if (preorder[p_start] == inorder[i]) break;
//        }
//        可以使用hashMap进行空间换时间。
//        i_root_index = map.get(node.val);
        int leftNumNodes =  i_root_index - i_start;
        node.left = DFSBuildTree(p_start+1,p_start+1+leftNumNodes,preorder,i_start,i_start+leftNumNodes,inorder,hashMap);
        node.right = DFSBuildTree(p_start+1+leftNumNodes,p_end,preorder,i_root_index+1,i_end,inorder,hashMap);
            return node;
    }
    private void buildInorderMap(Map map,int[] inorder){
        for (int i = 0; i < inorder.length; i++) {
            map.put(inorder[i],i);
        }
    }