程式碼隨想錄演算法訓練營第17天 | 複習二叉搜尋樹

hailicy發表於2024-07-22

2024年7月19日

題654. 最大二叉樹
熟練運用遞迴即可

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        int maxNum = Integer.MIN_VALUE;
        int flag=-1;
        for(int i=0;i<nums.length;i++){
            if(nums[i]>maxNum){
                maxNum = nums[i];
                flag=i;
            }
        }
        int i=0,j=nums.length-1;
        //此時被分為了[i,flag-1]和[flag+1,j]
        TreeNode root = new TreeNode(nums[flag]);
        root.left=digui(nums,i,flag-1);
        root.right=digui(nums,flag+1,j);
        return root;
    }

    public TreeNode digui(int[] nums,int left,int right){
        //首先構建左子樹的頭,然後構建右子樹的頭
        if(left>right){
            return null;
        }
        //找出最大值
        int maxNum = Integer.MIN_VALUE;
        int flag=-1;
        for(int i=left;i<=right;i++){
            if(nums[i]>maxNum){
                maxNum = nums[i];
                flag=i;
            }
        }
        int i=left,j=right;
        TreeNode p = new TreeNode(nums[flag]);
        p.left=digui(nums,i,flag-1);
        p.right=digui(nums,flag+1,j);
        return p;
    }
}

題617. 合併二叉樹
注意遞迴使用

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1==null && root2==null){
            return null;
        }else if(root1==null && root2!=null){
            TreeNode root = new TreeNode(root2.val);
            root.left = mergeTrees(null,root2.left);
            root.right=mergeTrees(null,root2.right);
            return root;
        }else if(root1!=null && root2==null){
            TreeNode root = new TreeNode(root1.val);
            root.left = mergeTrees(null,root1.left);
            root.right=mergeTrees(null,root1.right);
            return root;
        }else{
            TreeNode root = new TreeNode(root1.val+root2.val);
            root.left = mergeTrees(root2.left,root1.left);
            root.right=mergeTrees(root2.right,root1.right);
            return root;
        }
    }
}

題700. 二叉搜尋樹中的搜尋
藉助搜尋樹的特性剪枝,左子樹更小,右子樹更大

class Solution {

    TreeNode p;

    public TreeNode searchBST(TreeNode root, int val) {
        p=null;
        digui(root,val);
        return p;
    }

    public void digui(TreeNode root,int val){
        if(root==null){
            return;
        }else{
            if(root.val==val){
                p=root;
                return;
            }else{
                if(root.val>val){
                    digui(root.left,val);
                }else{
                    digui(root.right,val);
                }
            }
        }
    }
}

題98. 驗證二叉搜尋樹
要想到中序遍歷就是遞增的,所以先得到中序然後檢查是不是嚴格遞增即可

import java.util.*;

class Solution {

    Vector<Integer> vec;

    public boolean isValidBST(TreeNode root) {
        if(root==null){
            return false;
        }
        vec = new Vector<>();
        //中序遍歷,然後檢查是不是遞增的
        digui(root.left);
        vec.add(root.val);
        digui(root.right);
        //檢查vec
        for(int i=0;i<vec.size()-1;i++){
            if(vec.get(i)>=vec.get(i+1)){
                return false;
            }
        }
        return true;

    }

    public void digui(TreeNode root){
        if(root==null){
            return;
        }else{
            digui(root.left);
            vec.add(root.val);
            digui(root.right);
        }
        
    }
}

相關文章