刷题日记20 | 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

73 阅读1分钟

刷题日记20

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 build(nums, 0, nums.length - 1);
    }
    public TreeNode build(int[] nums, int left, int right){
        if(left > right) return null;
        int mid = left + (right - left) / 2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = build(nums, left, mid - 1);
        node.right = build(nums, mid + 1, right);
        return node;
    }
}

538. 把二叉搜索树转换为累加树

class Solution {
    public int sum = 0;
    public TreeNode convertBST(TreeNode root) {
        traversal(root);
        return root;
    }
    public void traversal(TreeNode root){
        if(root == null) return;
        convertBST(root.right); 
        sum += root.val;
        root.val = sum;
        convertBST(root.left);
    }
}