代码随想录Day23 | 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树 | 二叉树、递归、BST

70 阅读1分钟

669. 修剪二叉搜索树

题目链接:669. 修剪二叉搜索树

思路: 1、root.val < lo,这种情况下 root 节点本身和 root 的左子树全都是小于 lo 的,都需要被剪掉**。

2、root.val > hi,这种情况下 root 节点本身和 root 的右子树全都是大于 hi 的,都需要被剪掉**。

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

总结:

108. 将有序数组转换为二叉搜索树

题目链接:108. 将有序数组转换为二叉搜索树

思路: 一个有序数组对于 BST 来说就是中序遍历结果,根节点在数组中心,数组左侧是左子树元素,右侧是右子树元素。

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return bulid(nums, 0, nums.length - 1);
    }

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

总结:

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

题目链接:538. 把二叉搜索树转换为累加树

思路:

维护一个外部累加变量 sum,在遍历 BST 的过程中增加 sum,同时把 sum 赋值给 BST 中的每一个节点,就将 BST 转化成累加树了。

注意顺序,正常的中序遍历顺序是先左子树后右子树,这里需要反过来,先右子树后左子树。

class Solution {

    int sum = 0;

    public TreeNode convertBST(TreeNode root) {
        traverse(root);
        return root;
    }

    void traverse(TreeNode root) {
        if (root == null) {
            return;
        }
        traverse(root.right);
        sum += root.val;
        root.val = sum;
        traverse(root.left);
    }
}

总结: