669. 修剪二叉搜索树
找到小数字的右子树与大数字左子树必须要重新检查一遍然后让root的左右直接指向return的左右节点;
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == NULL) return NULL;
if (root->val < low) {
// root->left = trimBST(root->right, low, high);
TreeNode* right = trimBST(root->right, low, high);
return right;
}
if (root->val > high) {
TreeNode* left = trimBST(root->left, low, high);
return left;
}
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
108. Convert Sorted Array to Binary Search Tree
这个题尝试把 root->left = traversal(nums, left, mid - 1); 里面的left改成0但是不行,因为left和right的数值在迭代的过程中会被mid动态替换;
class Solution {
public:
// 左闭右闭区间[left, right]
TreeNode* traversal(vector<int>& nums, int left, int right) {
if (left > right) return NULL; //这句话是因为下面mid可能减一或者加一,然后那mid减完之后还可能变成left或者right,所下面的left和right不能改成0和nums.size() -1;
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) {
TreeNode * root = traversal(nums, 0, nums.size()-1);
return root;
}
};
538.把二叉搜索树转换为累加树
注意要右中左来遍历二叉树, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值,就是反中序来做累加;
class Solution {
private:
int pre = 0; // 记录前一个节点的数值
void traversal(TreeNode* cur) { // 右中左遍历
if (cur == NULL) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};