✅✅代码随想录算法训练营Day23 || 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树

98 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情🚀🚀

669. 修剪二叉搜索树 - 力扣(LeetCode)

image.png

递归

var trimBST = function(root, low, high) {
    if(!root)
    return null
    if(root.val < low){
         return root.left = trimBST(root.right,low,high); 
    }
    if(root.val > high){
         return root.right = trimBST(root.left,low,high);
    }
    root.left = trimBST(root.left,low,high)
    root.right = trimBST(root.right,low,high)
    return root
};

注意

这种重构二叉树结构的题,其实难度也有限。

找到与条件不符合的点之后,就进行结点的删除,以及判断要删除结点的结构中有没有是在条件范围内的,并将其返回。

总之没有想象中那么难了~

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

image.png

递归

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

难点

这道题的难点就在,首先要思考如何重构一个二叉搜索树,所以这里就用二叉树的特性,小的放左边,大的放右边。

root.left = dfs(nums.slice(left,mid)) 
root.right = dfs(nums.slice(mid+1))

另外一个难点就是如何处理边界了,这里注意一下slice的使用即可。

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

image.png

递归

var convertBST = function(root) {
    if(!root) return root;
    let sum = 0;
    const dfs = (root) => {
        if(!root) return null
        if(!root.left && !root.right){
            root.val = root.val + sum;
            sum =  root.val;
            return root
        }
        dfs(root.right);
        root.val = root.val + sum;
        sum = root.val;
        dfs(root.left)
        return root
    }
    return dfs(root)
};

这里就是换了一种递归方式罢了,还是比较简单的~