669. 修剪二叉搜索树
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root==nullptr)
return nullptr;
if(root->val<low)
return trimBST(root->right,low,high);
if(root->val>high)
return trimBST(root->left,low,high);
root->left=trimBST(root->left,low,high);
root->right=trimBST(root->right,low,high);
return root;
}
};
解法一:采用前序遍历,修剪根节点,不能直接返回nullptr,因为子树仍可能存在符合要求的节点。考虑搜索树的特性,只需要对一个方向的子树递归即可。
class Solution {
public:
TreeNode* deleteOne(TreeNode* root){
if (root->left == nullptr)
return root->right;
if (root->right == nullptr)
return root->left;
auto cur = root->right;
while (cur->left) {
cur = cur->left;
}
cur->left = root->left;
return root->right;
};
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr)
return nullptr;
root->left = trimBST(root->left, low,high);
root->right = trimBST(root->right, low, high);
if (root->val<low||root->val>high) {
return deleteOne(root);
}
return root;
}
};
解法二:采用后序遍历,保证左右子树的合法性,对于非法根节点,进行删除根的操作即可。
108. 将有序数组转换为二叉搜索树
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size()==0)
return nullptr;
int mid=(nums.size()-1)/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;
}
};
搜索树特性:中序遍历递增,即左<根<右,所以left利用前半段构建,right利用后半段。
538. 把二叉搜索树转换为累加树
class Solution {
public:
TreeNode *pre=nullptr;
TreeNode* convertBST(TreeNode* root) {
if(root==nullptr)
return nullptr;
convertBST(root->right);
if(pre){
root->val+=pre->val;
}
pre=root;
convertBST(root->left);
return root;
}
};
题目要求累加>=root的值,结合搜索树中序(左->根->右)递增的特性,这里所以采用右->根->左的遍历方式,同时利用pre指针指向前置节点,实现前缀和的计算。