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

17 篇文章 0 订阅

669.修剪二叉搜索树108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树

669.修剪二叉搜索树

修剪二叉搜索树,加入我们访问到了空节点,我们理所应当要返回一个nullptr。
如果我们访问的节点的值大于上界high,我们就返回这个节点的左孩子的剪枝结果。
同理,如果节点的值小于下界low,我们返回这个节点的有孩子的剪枝结果。
如果,节点的值等于上界或下界,我们让它的右孩子或者左孩子指向空,并且 让它的左孩子或右孩子进行剪枝。

代码

 */
class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root==nullptr) return nullptr;
        if(root->val>high) return trimBST(root->left,low,high);
        if(root->val<low) return trimBST(root->right,low,high);
        if(root->val ==high)
            root->right = nullptr;
        else if(root->val == low) root->left = nullptr;
        root->left = trimBST(root->left,low,high);
        root->right = trimBST(root->right,low,high);
        return root;
    }
};

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

很容易想到的思路,就是进行递归,如果数组为空数组,直接返回NULL。
如果不为空,就把中间的节点当成根节点进行下一轮的递归。
就是中间节点的左面构建成左子树。中间节点的右面元素构建成右子树。

代码

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if(nums.size()==0) return NULL;
        else if(nums.size()==1) return new TreeNode(nums[0]);
            int mid = nums.size()/2;
            TreeNode*p = new TreeNode(nums[mid]);
            vector<int> leftv(nums.begin(),nums.begin()+mid);
            p->left = sortedArrayToBST(leftv);
            vector<int> rightv(nums.begin()+mid+1,nums.end());
            p->right = sortedArrayToBST(rightv);
            return p;
    }
};

这样子很好想,但是时间复杂度很高,本人想了想,应该是调用size函数时,把数组又访问了一边,如果调整这个时间复杂度的话,可以再创建一个函数,直接调用下标即可,这样子会降低复杂度

优化代码

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) {
        TreeNode* root = traversal(nums, 0, nums.size() - 1);
        return root;
    }
};

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

很显然,我们要把最大的值累计加起来,因此,我们访问到一个节点时候,需要用的其右孩子的信息,访问左孩子的时候,需要根节点和右孩子的信息。
因此,我们应该采取,右中左的遍历顺序。
因此,我们定义一个全局遍历sum,初始化为0.
如果右孩子存在,就访问右孩子
之后让sum+=root.val
并让根节点的值等于sum
如果左孩子存在,访问左孩子。
返回根节点即可。

代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值