代码随想录算法训练营第21天 | 二叉搜索树结尾

2024年7月23日

题669. 修剪二叉搜索树
暴力做法是找出所有不符合的节点再一一删除。

import java.util.*;

class Solution {

    ArrayList<Integer> list;

    public TreeNode trimBST(TreeNode root, int low, int high) {
        list = new ArrayList<>();
        digui(root);
        for(int i=0;i<list.size();i++){
            if(list.get(i)<low||list.get(i)>high){
                root = del(root, list.get(i));
            }
            
        }
        return root;
    }

    public void digui(TreeNode root){
        if(root!=null){
            list.add(root.val);
            digui(root.left);
            digui(root.right);
        }
        
    }

    public TreeNode del(TreeNode root, int val){
        if(root==null){
            return null;
        }else if(val>root.val){
            root.right = del(root.right,val);
            return root;
        }else if(val<root.val){
            root.left = del(root.left,val);
            return root;
        }else{
            //左右子树都空
            if(root.left==null && root.right==null){
                return null;
            }else if(root.left!=null && root.right==null){
                return root.left;
            }else if(root.left==null && root.right!=null){
                return root.right;
            }else{
                TreeNode cur = root.right;
                while(cur.left!=null){
                    cur = cur.left;
                }
                cur.left = root.left;
                return root.right;
            }
        }
    }
    
}

优秀做法:依据二叉搜索树的特性,如果左子树都小了,就递归处理右子树。如果右都小了,就递归处理左子树。如果当前节点满足,就递归处理左右。

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if (root == null) return null;
        if (root.val < low) return trimBST(root.right, low, high);
        else if (root.val > high) return trimBST(root.left, low, high);
        root.left = trimBST(root.left, low, high);
        root.right = trimBST(root.right, low, high);
        return root;
    }
}

题108. 将有序数组转换为二叉搜索树
每次寻找中点递归建立即可,类似二分法,注意开闭区间的选择,一般用闭区间方便理解。

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        int left=0, right=nums.length-1;
        int mid = (left+right)/2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = digui(nums,left,mid-1);
        root.right = digui(nums,mid+1,right);
        return root;
    }

    public TreeNode digui(int[] nums, int left, int right){
        if(left>right){
            return null;
        }else{
            int mid = (left+right)/2;
            TreeNode root = new TreeNode(nums[mid]);
            root.left = digui(nums,left,mid-1);
            root.right = digui(nums,mid+1,right);
            return root;
        }
    }
}

题538. 把二叉搜索树转换为累加树
大于等于,就想到当前节点和右子树了。因此按照右中左的顺序递归处理。

class Solution {

    int sum;

    public TreeNode convertBST(TreeNode root) {
        sum=0;
        digui(root);
        return root;
    }

    public void digui(TreeNode root){
        if(root==null){
            return;
        }else{
            digui(root.right);
            sum+=root.val;
            root.val = sum;
            digui(root.left);
            return;
        }
    }
}
posted @ 2024-07-24 08:56  hailicy  阅读(1)  评论(0编辑  收藏  举报