問題描述:
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重復的元素。
例如,給出
前序遍歷 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); }