打卡-算法训练营-Day21 | 669. 修剪二叉搜索树;108. 将有序数组转换为二叉搜索树; 538. 把二叉搜索树转换为累加树

36 阅读1分钟

修剪二叉搜索树

leetcode链接:leetcode.cn/problems/tr…

平衡二叉树是指该树所有节点的左右子树的深度相差不超过1

需要递归处理待删除节点的左右子树,当前节点的值小于low时,右子树可能会存在符合区间的节点;当前节点的值大于high时,左子树可能会存在符合区间的节点

var trimBST = function(root, low, high) {
    if (!root) 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;
};

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

leetcode链接:leetcode.cn/problems/co…

var sortedArrayToBST = function(nums) {
    // 区间是[left, right]
    let dfs = (nums, left, right) => {
        if (left > right) return null;
        let mid = Math.floor((right - left) / 2) + left;
        let newNode = new TreeNode(nums[mid]);
        newNode.left = dfs(nums, left, mid - 1);
        newNode.right = dfs(nums, mid + 1, right);
        return newNode;
    }
    return dfs(nums, 0, nums.length - 1);
};

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

leetcodel链接:leetcode.cn/problems/co…

使用双指针,找到搜索二叉树中的最大值,然后递归遍历更新节点的值

var convertBST = function(root) {
    let pre = 0;
    let dfs = (cur) => {
        if (cur === null) return;
        dfs(cur.right); // 右
        // 中
        cur.val += pre;
        pre = cur.val;
        dfs(cur.left); // 左
    }
    dfs(root);
    return root;
};