1.(重点!!!)Trim a Binary Search Tree
这题代码不难,但确实挺难想到的。尤其是用递归去跳过剪枝的操作,太强了!
class Solution {
private:
TreeNode* dfs(TreeNode* root, int low, int high){
if(!root) return root;
if(root->val < low){
TreeNode* right = trimBST(root->right, low, high);
return right;
}else if(root->val > high){
TreeNode* left = trimBST(root->left, low, high);
return left;
}
root->left = dfs(root->left, low, high);
root->right = dfs(root->right, low, high);
return root;
}
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
return dfs(root, low, high);
}
};
2.Convert Sorted Array to Binary Search Tree
我本来的想法是slice整个vector,但后来发现可以做,但是太麻烦。不如借助divide and conquer思想,把这个先搞了。
class Solution {
private:
TreeNode* dfs(vector<int>& nums, int l, int r){
if(l == r){
return new TreeNode(nums[l]);
}else if(l > r){
return nullptr;
}
int mid = (l + r) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = dfs(nums, l, mid-1);
root->right = dfs(nums, mid+1, r);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
int len = nums.size()-1;
return dfs(nums, 0, len);
}
};
纸老虎题,本质上只是在考察遍历顺序罢了。
class Solution {
private:
int sum = 0;
void dfs(TreeNode* root){
if(!root) return;
dfs(root->right);
root->val += sum;
sum = root->val;
dfs(root->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
dfs(root);
return root;
}
};
本文介绍了三种针对二叉搜索树的操作:1)TrimaBinarySearchTree,通过递归实现剪枝操作;2)ConvertSortedArraytoBinarySearchTree,利用分治策略将有序数组转换为平衡二叉搜索树;3)ConvertBSTtoGreaterTree,转换二叉搜索树,使其每个节点值为原值加上所有小于它的节点值之和。

被折叠的 条评论
为什么被折叠?



