669. 修剪二叉搜索树
我们在分析的时候要注意,如果本层root小于low,那么证明root的左子树一定可以舍弃掉,但是root的右子树仍大于root还有修剪和保留的价值,所以应该继续修剪右子树然后返回root->right。另一种情况同理。
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root==nullptr) return nullptr;
if(root->val<low)
{
auto left=trimBST(root->right,low,high);
return left;
}
if(root->val>high)
{
auto right=trimBST(root->left,low,high);
return right;
}
root->left=trimBST(root->left,low,high);
root->right=trimBST(root->right,low,high);
return root;
}
};
108.将有序数组转换为二叉搜索树
为了是平衡的,我们需要保证每次中间进行分割。我们这里使用的是左闭右闭。
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums,0,nums.size()-1);
}
TreeNode * traversal(vector<int> &nums,int left,int right)
{
if(left>right) return nullptr;
int mid=left+(right-left)/2;
TreeNode *root=new TreeNode(nums[mid]);
root->left=traversal(nums,left,mid-1);
root->right=traversal(nums,mid+1,right);
return root;
}
};
538.把二叉搜索树转换为累加树
其实和有序数组的思路一样,因为二叉搜索树本质上就可以转变为有序数组。双指针,右中左遍历就可以得到降序数组。
class Solution {
public:
int pre;
TreeNode* convertBST(TreeNode* root) {
int pre=0;
traversal(root);
return root;
}
void traversal(TreeNode *cur)
{
if(cur==nullptr) return;
traversal(cur->right);
cur->val+=pre;
pre=cur->val;
traversal(cur->left);
}
};