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

題目:

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出:

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

返回如下的二叉樹:
在這裏插入圖片描述

思路:

先序遍歷的順序是 Root -> Left -> Right,這就能方便的從根開始構造一棵樹。
首先,preorder 中的第一個元素一定是樹的根,這個根又將 inorder 序列分成了左右兩棵子樹。現在我們只需要將先序遍歷的數組中刪除根元素,然後重複上面的過程處理左右兩棵子樹。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

代碼:

貼上筆者的代碼:

class Solution {
    
    public TreeNode buildTree(int[] preorder, int[] inorder) {

        if (preorder == null || inorder == null
                || preorder.length == 0
                || inorder.length == 0) {
            return null;
        }

        List<Integer> preList = new ArrayList<>();
        for (int i = 0; i < preorder.length; i++) {
            preList.add(preorder[i]);
        }
        return helper(preList, inorder);
    }

    private TreeNode helper(List<Integer> preList, int[] inorder) {

        if (preList.size() == 0 || inorder == null || inorder.length == 0) return null;

        int value = preList.get(0);
        preList.remove(0);
        TreeNode node = new TreeNode(value);

        int[] leftTree = null;
        int[] rightTree = null;
        for (int i = 0; i < inorder.length; i++) {
            if (inorder[i] == value) {
                leftTree = i==0?null:Arrays.copyOfRange(inorder, 0, i);
                rightTree = i==inorder.length-1?null:Arrays.copyOfRange(inorder, i+1, inorder.length);
            }
        }

        node.left = helper(preList, leftTree);
        node.right = helper(preList, rightTree);

        return node;
    }
}

提交後獲得通過:
在這裏插入圖片描述
不過看起來擊敗的用戶數量不多,還有很大的優化空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章