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.将有序数组转换为二叉搜索树
要点:选取数组中点为root,截取左右区间,构造二叉树,因为数组本身就是有序的,所以中点左边区间构造左子树,右边区间构造右子树。
class Solution {
public:
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;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums, 0, nums.size() - 1);
}
};
538.把二叉搜索树转换为累加树
要点:这道题是一个右中左的反中序遍历,处理中间节点的逻辑的时候,需要加上上一个遍历节点的值。
class Solution {
public:
int pre = 0;
TreeNode* traversal(TreeNode* root) {
if (root == nullptr)
return nullptr;
root->right = traversal(root->right);
root->val += pre;
pre = root->val;
root->left = traversal(root->left);
return root;
}
TreeNode* convertBST(TreeNode* root) { return traversal(root); }
};