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

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

思路:有被难到这道题,一开始考虑的就是删除某个不满足的节点后左右子树怎么处理,其实只要处理该节点的左子树或者右子树(可以细想一下),另一颗子树直接删掉就好了,麻烦就麻烦在进入子树之后,以该节点为根节点的左右子树又该怎么处理,想来想去没想出来,后来看了解析,我开始的这种方法天然对应迭代法,因为该根节点满足条件,只要把左子树中太小了的删掉就可以了,这就只要删除最左边的那些节点就可以,右子树就只要删除最右边那些太大了的即可。

TreeNode* trimBST(TreeNode* root, int low, int high) {
    if(root == NULL) return NULL;
    while(root != NULL && (root->val < low || root->val > high)){
        if(root->val < low) root = root->right;
        else root = root->left;
    }
    TreeNode* cur = root;
    while(cur != NULL){
        while(cur->left && cur->left->val < low){
            cur->left = cur->left->right;
        }
        cur = cur->left;
    }
    cur = root;
    while(cur != NULL){
        while(cur->right && cur->right->val > high){
            cur->right = cur->right->left;
        }
        cur = cur->right;
    }
    return root;
}

还有一种代码非常简洁的递归法(首次既进入子树,又再次进入子树取得返回值)。

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);
    root->left = trimBST(root->left, low, high);
    root->right = trimBST(root->right, low, high);
    return root;
}

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

思路:简单的用数组构造二叉树,每次取数组中间的值生成根节点即可构造平衡树。

TreeNode* traversal(vector<int>& nums, int start, int end){
    if(start > end) return NULL;
    if(start == end){
        return new TreeNode(nums[start]);
    }
    int rootIndex = (start+end)/2;
    TreeNode* root = new TreeNode(nums[rootIndex]);
    root->left = traversal(nums, start, rootIndex-1);
    root->right = traversal(nums, rootIndex+1, end);
    return root;
}

TreeNode* sortedArrayToBST(vector<int>& nums) {
    return traversal(nums, 0, nums.size()-1);
}

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

思路:直接反着中序遍历把上一个加到本节点的值上来就可以了,递归和迭代都非常简单。

void traversal(TreeNode* root){
    if(root->right) traversal(root->right);
    if(pre) root->val += pre->val;
    pre = root;
    if(root->left) traversal(root->left);
}

TreeNode* convertBST(TreeNode* root) {
    if(root==NULL) return root;
    traversal(root);
    return root;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_porter

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

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

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

打赏作者

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

抵扣说明:

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

余额充值