【算法第十九天8.3】669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

链接力扣669. 修剪二叉搜索树

思路

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        // 如果遇到不合适的,不能直接将其砍掉
        // 如果是左子树根节点小了:则要考虑左子树的右孩子会不会在范围之内
        // 如果是右子树根节点大了:则要考虑右子树的左孩子会不会在范围之内
        if(root == null) return root;
        if(root.val < low){
            TreeNode right = trimBST(root.right,low,high);
            return right;
        }
        if(root.val > high){
            TreeNode left = trimBST(root.left,low,high);
            return left;
        }
        // 节点的左右子树接住上面返回的树
        root.left = trimBST(root.left,low,high);
        root.right = trimBST(root.right,low,high);
        return root;
    }
}

链接力扣108.将有序数组转换为二叉搜索树

思路

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return BST(nums,0,nums.length - 1);
    }
    public TreeNode BST(int[] nums,int startIndex,int endIndex){
        // 如果是左闭右开:则左右索引可能会相等,但相等了就越界了
        // 没有等号的情况下,则不是左闭右开:则可以相等,这样可以将这个节点包含进来
        if(startIndex > endIndex) return null;
        int mid = (startIndex + endIndex) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = BST(nums,startIndex,mid-1);
        root.right = BST(nums,mid+1,endIndex);
        return root;
    }
}

链接力扣538.把二叉搜索树转换为累加树

思路

class Solution {
    int pre = 0;
    public TreeNode convertBST(TreeNode root) {
        if(root == null) return root;
        // 右、中、左的顺序
        convertBST(root.right);
        root.val += pre;
        pre = root.val;
        convertBST(root.left);
        return root;
    }
}

你可能感兴趣的:(算法,java,数据结构)