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

目录

669 修剪二叉搜索树

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

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


669 修剪二叉搜索树

在递归函数中对当前节点进行判断,有如下四种情况:

  1. 如果节点为空,则返回空
  2. 如果节点的值小于low,说明该节点需要被移除且根据二叉搜索树性质,我们应在该节点的右子树中寻找合适的节点
  3. 如果节点的值大于于high,说明该节点需要被移除且根据二叉搜索树性质,我们应在该节点的左子树中寻找合适的节点。
  4. 如果不在上述情况中,说明该节点不用被移除,继续递归寻找该节点的左节点和右节点。
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);
        //此节点的值在[low,high]区间内
        root.left = trimBST(root.left,low,high);
        root.right = trimBST(root.right,low,high);
        return root;
    }
}

时间复杂度O(n)

空间复杂度O(n) 

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

依照题意,我们需要将数组转化为一颗高度平衡的二叉搜索树(二叉树每个节点的左右两个子树的高度差的绝对值不超过1),并且由于是有序数组,所以我们从中间开始转换,划分左右数组,递归创建左子树和右子树。

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return BSTBuildHelper(nums,0,nums.length);
    }
    private TreeNode BSTBuildHelper(int[] nums,int l,int r){//左闭右开
        if(l >= r)return null;
        int mid = (r - l) / 2 + l;
        TreeNode cur = new TreeNode(nums[mid]);
        cur.left = BSTBuildHelper(nums,l,mid);
        cur.right = BSTBuildHelper(nums,mid + 1,r);
        return cur;
    }
}

时间复杂度O(n)

空间复杂度O(logn)为栈的深度,且构建的是高度平衡二叉树 

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

由于该树为二叉搜索树,累加树节点的新值应该为该节点原来右子树原值总和,所以可以通过反序中序遍历的方式从树的右叶子结点开始用sum记录所有节点值的和,并赋值给新树中的节点。

class Solution {
    int sum = 0;
    public TreeNode convertBST(TreeNode root) {
        BSThelper(root);
        return root;
    }
    private void BSThelper(TreeNode cur){//按照右中左的顺序依次递归
        if(cur == null)return;
        BSThelper(cur.right);
        sum += cur.val;
        cur.val = sum;
        convertBST(cur.left);
    }
}

时间复杂度O(n)

空间复杂度O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值