669修剪二叉搜索树
利用二叉搜索树的特性
修剪树,是从上到下的寻找过程,所以中左右是前序。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root==nullptr) return nullptr;
if(root->val < low){
TreeNode* right=trimBST(root->right,low,high);
return right;
}
if(root->val > high){
TreeNode* left=trimBST(root->left,low,high);
return left;
}
root->left=trimBST(root->left,low,high);
root->right=trimBST(root->right,low,high);
return root;
}
};
108将有序数组转换为二叉树
注意边界问题,不变量。
只有非负数的正数,除以2和右移一位才等效。
class Solution {
public:
TreeNode* buildTree(vector<int>& nums,int begin,int end){
int mid=begin+(end-begin)/2;
if(begin>end)
return nullptr;
TreeNode* root= new TreeNode(nums[mid]);
cout<<"root->val"<<root->val<<endl;
cout<<"mid"<<mid<<endl;
cout<<"begin"<<begin<<"end"<<end<<endl;
root->left=buildTree(nums,begin,mid-1);
root->right=buildTree(nums,mid+1,end);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return buildTree(nums,0,nums.size()-1);
}
};
538.把二叉搜索树转换为累加树
class Solution {
public:
int pre=0;
TreeNode* convertBST(TreeNode* root) {
if(root==nullptr) return nullptr;
root->right=convertBST(root->right);
root->val+=pre;
pre=root->val;
root->left=convertBST(root->left);
return root;
}
};