修建二叉搜索树
题目
如果一个当前节点<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;
一个技巧
如果碰到二叉搜索树没头绪时,可以先想一想面对一个有序数组的话会用什么方法。