重建二叉樹
問題描述:
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字
解題思路
遞歸法
- 先使用字典保存
前序遍歷
數組中每個元素在中序遍歷
數組中對應的索引值,目的:空間換時間。大體思路:對于每個前序遍歷數組中的元素X
,查字典得其對應得索引值I
,則其左子樹的所有值在中序遍歷數組中索引值為I
的左邊,右子樹的所有元素在中序遍歷數組中索引值為I
的右邊,遞歸建樹即可 - 時間復雜度:
O(n)
,空間復雜度:O(n)
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null || preorder.length == 0 || inorder.length == 0)
return null;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < inorder.length; ++i) {
map.put(inorder[i], i);
}
return helper(0, preorder, map, 0, preorder.length - 1);
}
// i: 先序遍歷的索引
// left: 以 preorder[i] 為根的樹,其左子樹在中序遍歷數組中開始的位置
// right: 以 preorder[i] 為根的樹,其右子樹在中序遍歷數組中結束的位置
private TreeNode helper(int i, int[] preorder, Map<Integer, Integer> map, int left, int right) {
if (left > right)
return null;
TreeNode cur = new TreeNode(preorder[i]);
int idx = map.get(preorder[i]);
cur.left = helper(i + 1, preorder, map, left, idx - 1);
// idx - left 表示以 cur 為根,其左子樹的節點個數
cur.right = helper(i + idx - left + 1, preorder, map, idx + 1, right);
return cur;
}
}