LeetCode刷题day23||669. 修剪二叉搜索树&&108.将有序数组转换为二叉搜索树&&538.把二叉搜索树转换为累加树--二叉树

669. 修剪二叉搜索树

题目描述

在这里插入图片描述
题目链接

思路分析

那么将节点0的右孩子 节点2 直接赋给 节点3的左孩子就可以了(就是把节点0从二叉树中移除)
在这里插入图片描述
因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。

但是有返回值,更方便,可以通过递归函数的返回值来移除节点。

  • 如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。

  • 如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。

  • 处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。

大于high的情况类比

代码

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr) return nullptr;
        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.将有序数组转换为二叉搜索树

题目描述

在这里插入图片描述
在这里插入图片描述
题目链接

思路分析

本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。

代码

class Solution {
private: 
    TreeNode* traversal(vector<int>& nums, int left, int right) {
         if (left > right) return nullptr;
         int mid = left + ((right - left) / 2);
         TreeNode* root = new TreeNode(nums[mid]);
         root->left = traversal(nums, left, mid - 1);
         root->right = traversal(nums, mid + 1, right);
         return root;

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

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

题目描述

在这里插入图片描述
在这里插入图片描述
题目链接

思路分析

一棵二叉搜索树,换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13]

代码

class Solution {
private:
    int pre = 0;
    void traversal(TreeNode* root) {
        if (root == nullptr) return;
        traversal(root->right);
        root->val += pre;
        pre = root->val;
        traversal(root->left);
        return;
    }
public:
    TreeNode* convertBST(TreeNode* root) {
        pre = 0;
        traversal(root);
        return root;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值