重建二叉樹

重建二叉樹

問題描述:

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字

解題思路

遞歸法
  • 先使用字典保存 前序遍歷 數組中每個元素在 中序遍歷 數組中對應的索引值,目的:空間換時間。大體思路:對于每個前序遍歷數組中的元素 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;
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容