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

问题描述:

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

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

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

解题思路:

二叉树的先序遍历先访问根结点,其次遍历根节点的左子树,然后遍历根节点的右子树。

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

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

例如:已知一颗二叉树的先序序列为EBADCFHG,其中序序列为ABCDEFGH。下图说明了还原二叉树的过程:

 首先由先序序列知道二叉树的根结点为E,则其左子树的中序序列为ABCD,右子树的中序序列为FGH。

继而得到左子树先序序列为BADC,右子树先序序列为FHG。

重复上述步骤。

实现代码:

    private static TreeNode test(int[] preorder, int p, int q, int[] inorder, int i, int j) {

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

        TreeNode node = new TreeNode(preorder[p]);
        int k = i;
        // 找到根节点在中序遍历序列中的位置
        while (preorder[p] != inorder[k]) k++;
        node.left = test(preorder, p+1, p+k-i, inorder, i, k-1);
        node.right = test(preorder, p+k-i+1, q, inorder, k+1, j);

        return node;
    }

    public static TreeNode buildTree(int[] preorder, int[] inorder) {
        return test(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1);
    }

猜你喜欢

转载自www.cnblogs.com/deltadeblog/p/9296469.html