代码随想录算法训练营第二十三天|538.把二叉搜索树转换为累加树,669. 修剪二叉搜索树

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

反向中序遍历进行处理就可以了,设置全局参数sum,每遍历到一个新的节点,用sum和它相加,之后更新sum的值。

class Solution {
public:
    int sum=0;
    void digui(TreeNode* root)
    {
        if(root==nullptr)return ;
        digui(root->right);
        int cur=root->val;
        root->val+=sum;
        sum+=cur;
        digui(root->left);
        return;
    }
    

    TreeNode* convertBST(TreeNode* root) {
        sum=0;
        digui(root);
      
        return root;


    }
};

669. 修剪二叉搜索树

主要还是删除节点的思路,尽可能的不改变原来树的结构

1.当前节点大于high,接收当前节点的左节点递归得到的信息并返回。

2.当前节点小于low,接收当前节点的右节点递归得到的信息并返回。

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

    }
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        return digui(root,low,high);
    }
};

模拟实例(节点范围是1-3)

1.  3进入递归函数,此时root=3节点的指针(以下简称3,用节点的值代指节点),3在[1,3]内,不会进入if。

进入root->left=digui(root->left,low,high);代码执行,root->left此时为0;

2.   0进入函数,此时root=0,0<1,进入

if(root->val<low)
        {
        auto right=digui(root->right,low,high);
        return right;
        
        }

此时root->right=2,2进入递归

3.  此时root=2,因为2满足[1,3],执行

root->left=digui(root->left,low,high);
        root->right=digui(root->right,low,high);
        return root;

因为2的右节点为空,所以root->right=null,root->left=1满足[1,3],所以直接返回1

当3.节执行结束后,返回root(2),此时root->right==null,root->left==1;

回到2.节auto right=digui(root->right,low,high);的执行,3.节返回的root(2)被right所接受,返回right,

回到1.节root->left=digui(root->left,low,high)的执行,此时root=3,digui(root->left,low,high)返回的是节点2,此时3的左节点改为了2,0的删除结束。

总结来说,删除节点是直接把节点的子节点和节点的父节点直接相连。

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

还是拆分区间的思路,先取区间中点,利用中点值新建节点,利用中点值更新区间,进行递归。

注意两个条件1.这里是左闭右闭区间,所以begin>end时循环结束。

2.因为是左闭右闭,所以区间之间不能有交集

分割为[begin,mid-1],mid,[mid+1,end]三部分,其中中间部分已经赋值过了,所以下次递归不需要带上。

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

    }


    TreeNode* sortedArrayToBST(vector<int>& nums) {
        int begin=0;
        int end =nums.size()-1;
        return sorted(nums,begin,end);

    }
};

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值