中序与后序遍历序列构造二叉树

问题描述:

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

    3
   / 
  9  20
    /  
   15   7

解题思路:

中序遍历,先遍历左子树,然后遍历根结点,最后遍历右子树。

因此中序遍历序列被根节点分为两部分:根结点之前的部分为左子树结点中序序列,根结点之后的为右子树结点中序序列。

后序遍历,最后遍历根节点,故后序序列的最后一个元素为根节点。

由根节点在中序序列中的位置,可得到左子树与右子树的中序序列,也可得到左子树与右子树的后续序列。

实现代码:

    private static Map<Integer, Integer> map;

    private static TreeNode build(int[] postorder, int p, int q, int[] inorder, int i, int j) {

        if (p > q) return null;
        if (p == q) return new TreeNode(postorder[q]);

        TreeNode node = new TreeNode(postorder[q]);
        int k = map.get(postorder[q]);
        node.left = build(postorder, p, p+k-i-1, inorder, i, k-1);
        node.right = build(postorder, p+k-i, q-1, inorder, k+1, j);

        return node;
    }

    public static TreeNode buildTree(int[] inorder, int[] postorder) {

        map = new HashMap<Integer, Integer>(inorder.length);
        for (int i=0; i<inorder.length; i++) map.put(inorder[i], i);
        return build(postorder, 0, postorder.length-1, inorder, 0, inorder.length-1);
    }
原文地址:https://www.cnblogs.com/deltadeblog/p/9301523.html