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;
}
};
108. 将有序数组转换为二叉搜索树
class Solution {
private:
//采用2分法构造树,即为平衡二叉树
TreeNode* buildTree(vector<int>& nums, int left, int right) {
if (left > right) return nullptr;
int mid = (left + right)/2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = buildTree(nums, left, mid-1);
root->right = buildTree(nums, mid+1, right);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return buildTree(nums, 0, nums.size()-1);
}
};
538. 把二叉搜索树转换为累加树
class Solution {
public:
TreeNode* pre = nullptr;
TreeNode* convertBST(TreeNode* root) {
if (root == nullptr) return nullptr;
//右
root->right = convertBST(root->right);
if (pre != nullptr){
root->val += pre->val;
}
pre = root;
//左
root->left = convertBST(root->left);
return root;
}
};