【代码随想录|二叉搜索树04】

660.修剪二叉搜索树

题目链接https://leetcode.cn/problems/trim-a-binary-search-tree

边界是[1,3]

这里的思路是如果这个节点的左子树比最小边界小了,那它的左子树肯定更小,但是这个结点的右子树比这个节点大,所以有可能满足这个条件,上面这个节点0的左子树比最小边界小,我就往它的右子树去递归,只要2下面子树满足了,你return root 我就拿结点的左子树(3的左节点)去接住你,就把要删除的点(0)自动的忽略掉了。

再比如3往右去递归,4超出边界了,4就往左去递归,返回空,那3的右节点连到nullpstr,就删除掉了4

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr)
            return nullptr;
        else if (root->val < low) {//只要该结点比最小值小,往右去递归
            root = trimBST(root->right, low, high);
            return root;
        } else if (root->val > high) {
            root = trimBST(root->left, low, high);//只要该结点比最大值大,往左去递归
            return root;
        }
        root->left = trimBST(root->left, low, high);
        root->right = trimBST(root->right, low, high);
        return root;
    }
};

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

题目链接https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree

这里的思路应该是因为是升序数组,所以创造的二叉树应该是个金字塔型,像这样(假设

输入数组 [-10, -3, 0, 5, 9])

对应下标 [0, 1, 2, 3, 4, 5]

就是从根节点0开始我的左子树为(0,2)mid就为1,val->left往左去递归

-3这个节点继续去递归到左子树(nums,0,1),mid就为0,val->left往左去递归

-10这个节点继续去递归到左子树(nums,0,0),mid就为0,val->left继续递归

-10这个节点继续去递归到左子树(nums,0,-1),left>right了,返回nullpstr,然后开始返回上去。

其实这些节点不是没有尝试过往右val->right去递归,但是比如因为(nums,1,0)马上就left>rightl,它的右指针就会指向空,正好也构建出对的二叉树

class Solution {
     TreeNode* traversal(vector<int>& nums,int left,int right){
        if(left>right)return nullptr;//终止条件
        int mid=(left+right)/2;
        TreeNode*val=new TreeNode(nums[mid]);
        val->left=traversal(nums,left,mid-1);
        val->right=traversal(nums,mid+1,right);
        return val;
     }
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return traversal(nums,0,nums.size()-1);//这里是左闭右闭类型[0,nums.size()-1]
    }
};

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

题目链接https://leetcode.cn/problems/convert-bst-to-greater-tree

这里是要把每一个结点大于等于它的值全部加起来,因为这是个二叉搜索树,一个树里面如果进行中序左中右遍历的话,那么数组排序就是从小到大的排列的,但是本题是要从大到小进行相加,倒序相加那就可以进行右中左遍历的顺序。

class Solution {
public:
int pre=0;//pre初始化要放递归外面,不然无法累次相加
void traversal(TreeNode*root){
    if(root==NULL)return;//终止条件
    traversal(root->right);//右
    root->val+=pre;//中
    pre=root->val;
    traversal(root->left);//左
}
    TreeNode* convertBST(TreeNode* root) {
        traversal(root);
        return root;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值