669. 修剪二叉搜索树
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
//终止条件
if (root == NULL ) return NULL;
//节点值比范围最小值还小,因为是二叉搜索树,故向节点右子树继续搜索,返回这个节点的右子树
if (root->val < low) {
TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
return right;
}
//节点值比范围最大值还大,因为是二叉搜索树,故向节点左子树继续搜索,返回这个节点的左子树
if (root->val > high) {
TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
return left;
}
//删除节点后,让这个节点符合条件的左右孩子变成这个节点父节点的孩子
root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
return root;
}
};
08.将有序数组转换为二叉搜索树
class Solution {
private:
TreeNode* traversal(vector<int>& nums, int left, int right) {//传入左右为数组下标
//左下标大于右下标,非法肯定返回null,
if (left > right) return nullptr;//终止条件,区间为左闭右闭区间。没有等于号。
int mid = left + ((right - left) / 2);//找到中间节点
TreeNode* root = new TreeNode(nums[mid]);//中间节点传入值nums[mid]
//左右节点继续递归
root->left = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = traversal(nums, 0, nums.size() - 1);
return root;
}
};
538.把二叉搜索树转换为累加树
class Solution {
private:
int pre = 0; // 记录前一个节点的数值 双指针法
void traversal(TreeNode* cur) { // 右中左遍历,从后面逐渐把后面的值加给前面的值
//终止条件
if (cur == NULL) return;
//右
traversal(cur->right);
//中
cur->val += pre;
pre = cur->val;//更新pre的值
//左
traversal(cur->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};