前序與中序遍歷序列構造二叉樹


問題描述:

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意:
你可以假設樹中沒有重復的元素。

例如,給出

前序遍歷 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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM