代码随想录day21
669.修剪二叉搜索树
//理解修建后重建树的概念
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return nullptr;
if(root->val < low){
TreeNode* node = trimBST(root->right, low, high);
return node;
}
if(root->val > high){
TreeNode* node = trimBST(root->left, low, high);
return node;
}
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
108.将有序数组转化为二叉搜索树
TreeNode* sortedArrayToBST(vector<int>& nums) {
int sz = nums.size();
if(sz == 0) return nullptr;
if(sz == 1) return new TreeNode(nums[0]);
int mid = sz / 2;
TreeNode* root = new TreeNode(nums[mid]);
vector<int> left(nums.begin(), nums.begin()+mid);
vector<int> right(nums.begin()+mid+1, nums.end());
root->left = sortedArrayToBST(left);
root->right = sortedArrayToBST(right);
return root;
}
538.把二叉搜索树转换为累加树
//注意双指针法的变通,以及右中左遍历
int prev;
void traverse(TreeNode* root){
if(root == nullptr) return;
traverse(root->right);
root->val += prev;
prev = root->val;
traverse(root->left);
}
TreeNode* convertBST(TreeNode* root) {
prev = 0;
traverse(root);
return root;
}