算法修炼Day23|● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

51 阅读1分钟
题目:669. 修剪二叉搜索树 - 力扣(LeetCode)
思路/想法:

前序遍历。中的处理逻辑:当前节点值小于较小值时,向其右子树进行递归遍历,当前节点值大于较大值时,向其左子树进行遍历。左右进行递归遍历,返回root即可。

代码实现:
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);
        }
        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. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
思路/想法:

构造二叉树,前序遍历

代码实现:
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        // 高度平衡二叉搜索树(左右子树高度差小于等于1)
        // 中序遍历
        TreeNode root = sortedArrayToBST(nums, 0, nums.length);
        return root;
    }
    private TreeNode sortedArrayToBST(int[] nums, int left, int right) {
        if (left >= right) return null;
        if (right - left == 1) {
            return new TreeNode(nums[left]);
        }
        // [0,1,2,3,4,5] [0,1,2,3]
        // int mid = (right + left) / 2; // 存在内存溢出的情况
        int mid = left + (right - left) / 2;  
        TreeNode root = new TreeNode(nums[mid]);
        root.left = sortedArrayToBST(nums, left, mid);
        root.right = sortedArrayToBST(nums, mid + 1, right);
        return root;
    }
}
题目:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
思路/想法:

非纯粹的中序遍历,中序的镜像。

代码实现:
class Solution {
    int sum;
    public TreeNode convertBST(TreeNode root) {
        sum = 0;
        traversal(root);
        return root;
    }
    private void traversal(TreeNode root) {
        // 遍历顺序:右 中 左
        // 终止条件
        if (root == null) return;
        traversal(root.right); // 右
        // 中
        sum += root.val;
        root.val = sum;
        traversal(root.left); // 左
    }
}