代码随想录day21二叉树8
文章目录
- 108.将有序数组转换为二叉搜索树
- 538.把二叉搜索树转换为累加树
- 669. 修剪二叉搜索树
108.将有序数组转换为二叉搜索树
题目链接
文章讲解
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:// solve 函数递归地将部分数组转换为二叉搜索树TreeNode* solve(vector<int>& nums, int left, int right){// 递归结束条件:当左指针超过右指针时,表示当前区间无有效元素,返回 NULLif(left > right) return NULL;// 计算中间位置的索引,选择数组的中间元素作为当前子树的根节点int mid = left + ((right - left) / 2); // 防止溢出,采用这种写法计算中点// 创建当前节点的树节点,值为数组中的中间值TreeNode* node = new TreeNode(nums[mid]);// 递归构建左子树:左区间是从 left 到 mid-1node->left = solve(nums, left, mid - 1);// 递归构建右子树:右区间是从 mid+1 到 rightnode->right = solve(nums, mid + 1, right);// 返回当前创建的树节点return node;}// 主函数:将整个排序数组转换为高度平衡的二叉搜索树TreeNode* sortedArrayToBST(vector<int>& nums) {// 调用递归函数,初始时整个数组的区间是从 0 到 nums.size()-1TreeNode* res = solve(nums, 0, nums.size() - 1);// 返回生成的平衡二叉搜索树的根节点return res;}
};
538.把二叉搜索树转换为累加树
题目链接
文章讲解
class Solution {
public:// solve 函数执行逆中序遍历并更新节点值void solve(TreeNode* root, int& k) {if (root == NULL) return; // 如果节点为空,直接返回// 逆中序遍历:首先遍历右子树solve(root->right, k);// 更新当前节点值:将当前节点的值加上之前访问过的节点的值(k)root->val += k;// 更新 k 为当前节点的值k = root->val;// 最后遍历左子树solve(root->left, k);}// 主函数:将二叉搜索树转换为累加树TreeNode* convertBST(TreeNode* root) {int k = 0; // 初始化 k 为 0,用于累加solve(root, k); // 执行逆中序遍历并更新树的节点值return root; // 返回转换后的树的根节点}
};
669. 修剪二叉搜索树
题目链接
文章讲解
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:// 修剪二叉搜索树,返回符合区间 [low, high] 的树TreeNode* trimBST(TreeNode* root, int low, int high) {// 递归的基准条件:如果当前节点为空,则返回 nullptrif (root == nullptr) return nullptr;// 如果当前节点值小于 low,则不需要这个节点和它的左子树,递归修剪右子树if (root->val < low) {TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间 [low, high] 的节点return right; // 返回修剪后的右子树}// 如果当前节点值大于 high,则不需要这个节点和它的右子树,递归修剪左子树if (root->val > high) {TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间 [low, high] 的节点return left; // 返回修剪后的左子树}// 如果当前节点的值在 [low, high] 之间,递归修剪左右子树root->left = trimBST(root->left, low, high); // 修剪左子树root->right = trimBST(root->right, low, high); // 修剪右子树// 返回当前节点(它的左右子树已经被修剪)return root;}
};