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

修建二叉搜索树

题目
在这里插入图片描述
如果一个当前节点<low,那应该去查找它的右子树,并返回修建后的右子树;如果>high,那应该去看它的左子树怎么样,返回修建后的左子树。

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

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

题目
每次取int middle=nums.size()/2;
那么区间长度要么相等,要么相差1;
即是k和k+1;
长度k的区间这样要处理[log2 (k)]+1次。
严谨数学证明见:1382.

if(nums.size()==0) return NULL;
int l=0,r=nums.size()-1;
int middle=l+(r-l)/2;

int value=nums[middle];
TreeNode* root=new TreeNode(value);

vector<int> left(nums.begin(),nums.begin()+middle);
vector<int> right(nums.begin()+middle+1,nums.end());

root->left=sortedArrayToBST(left);
root->right=sortedArrayToBST(right);

return root;

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

题目
在这里插入图片描述

我的思路

看了一会后发现root->val+=root->right->val;(root->right就是大于它的累加和)
如果按照右中左的顺序来,然后再用双指针pre 和cur,就可以从大值开始向小遍历一遍。不停用pre的值的修改当前cur,再把它赋给pre,

if(root==NULL) return root;
root->right=convertBST(root->right);
 if(pre!=NULL){
     root->val+=pre->val;
 }
 pre=root;
 root->left=convertBST(root->left);
 return root;

一个技巧

如果碰到二叉搜索树没头绪时,可以先想一想面对一个有序数组的话会用什么方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值