刷題筆記02

taolll發表於2024-03-26

前序中序,後序中序確定一顆二叉樹。
後序中序確定的思路:
從postorder中取出最後一個數
以這個數為分界點分割中序陣列
再根據中序的分組分割後序陣列

點選檢視程式碼
class Solution {
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        for(int i = 0 ; i<inorder.length;i++){
            map.put(inorder[i],i);
        }
      return  buildnode(inorder,postorder,0,inorder.length-1,0,inorder.length-1);
    }
    public TreeNode buildnode(int[] inorder,int[] postorder,int l,int r,int pl,int pr){
        if(l>r) return null;
        int value = postorder[pr];
        TreeNode root = new TreeNode(value);
        int idx = map.get(value)-l;
        root.left=buildnode(inorder,postorder,l,l+idx-1,pl,pl+idx-1);
        root.right=buildnode(inorder,postorder,l+idx+1,r,pl+idx,pr-1);
        return root;
    }
}

難點在於遞迴的時候座標的變化,跟著例子捋一遍就能寫出來了。

654最大二叉樹

點選檢視程式碼
class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return coustruct(nums,0,nums.length-1);
    }
    TreeNode coustruct(int[] nums,int l,int r){
        if(l>r) return null;
        int max = l;
        for(int i = l+1;i<=r;i++){
            if(nums[i]>nums[max]){
                max = i;
            }
        }
        TreeNode root = new TreeNode(nums[max]);
        root.left=coustruct(nums,l,max-1);
        root.right=coustruct(nums,max+1,r);
        return root;
    }
}
開始慣性思維了,想再複製一份陣列排序模擬前面後序+中序的情況。

遞迴用最大值分割。時間複雜度為O(n²),最壞情況下為嚴格遞增或遞減。遞迴n蹭,對於第i層每層都要遍歷n-i次才能找到最大值。最佳化點就在於每輪的遍歷,如果每次新增元素就完成比較,時間複雜度就可以最佳化到O(n)。

單調棧:插入元素小於棧中元素,入棧,並把棧中元素的右指標指向入棧元素。大於,出棧直到找到不小於該元素的數,把入棧元素的左指標指向棧中元素。

程式碼明天寫

合併二叉樹。
一棵樹和兩棵樹的遍歷是一樣的,多傳一個節點就好了。
遞迴遍歷相加即可,root1==null,return root2。
也可以用佇列模擬層序遍歷對應位置相加。

相關文章