669. 修剪二叉搜索树
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr) return nullptr;
// 当前节点的值 < low ;
// 根据二叉搜索树左子树上的节点的小于根节点的节点值,所以左子树上的节点可以全部删除
// 右子树上的节点的大于根节点的节点值,我们要在遍历右子树判断 那些节点值在 [low, high] 范围内
if (root->val < low) return trimBST(root->right, low, high);
// 当 > high 时,右子树上全部大于,判断左子树
if (root->val > high) return trimBST(root->left, low, high);
// 当前节点的值在 [low, high] 范围内,分别遍历左右子树
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
会想到判断大于low的右子树,但是具体的处理很懵,脑子里全是删除节点的操作。
108.将有序数组转换为二叉搜索树
108.将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树。
平衡二叉搜索树 AVL树
左子树与右子树高度之差的绝对值不超过1
树的每个左子树和右子树都是AVL树
每一个节点都有一个平衡因子(balance factor),任一节点的平衡因子是-1、0、1(每一个节点的平衡因子 = 右子树高度 - 左子树高度)
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.把二叉搜索树转换为累加树
538.把二叉搜索树转换为累加树
要每个节点 node 的新值等于原树中大于或等于 node.val 的值之和;根据二叉搜索树的性质要优先遍历右子树,得到节点和;
class Solution {
public:
void convert (TreeNode* root, int& sum) {
if (root == nullptr) {
return;
}
convert(root->right, sum); // 遍历右子树
sum += root->val; // 大于等于node.val,更新节点和 在赋值
root->val = sum;
convert(root->left, sum); // 遍历左子树
}
TreeNode* convertBST(TreeNode* root) {
int sum = 0;
convert(root, sum);
return root;
}
};