**669. 修剪二叉搜索树 **
这道题目比较难,比 添加增加和删除节点难的多
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr) return nullptr;
// 修建是在递归中实现的
if (root->val < low) {
TreeNode* right = trimBST(root->right, low, high);
return right;
}
if (root->val > hight) {
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;
}
};
这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。
题目链接/文章讲解: https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
视频讲解: https://www.bilibili.com/video/BV17P41177ud
**108.将有序数组转换为二叉搜索树 **
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* node = nullptr;
if (nums.size() == 0)
return node;
int mid = nums.size() / 2;
TreeNode* root = new TreeNode(0);
root->val = nums[mid];
vector<int> vecleft(nums.begin(), nums.begin() + mid);
vector<int> vecright(nums.begin() + mid + 1, nums.end());
root->left = sortedArrayToBST(vecleft);
root->right = sortedArrayToBST(vecright);
return root;
}
};
本题就简单一些,可以尝试先自己做做。
https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1uR4y1X7qL
**538.把二叉搜索树转换为累加树 **
class Solution {
public:
void trival(TreeNode* root, int& pre) {
// 右中左遍历
if (root == nullptr) return ;
trival(root->right, pre);
root->val += pre;
pre = root->val;
trival(root->left, pre);
}
TreeNode* convertBST(TreeNode* root) {
// 二叉搜索树,左中右遍历是递增数组。
// 如果累加的话,右中左遍历累加就行
int pre = 0;
trival(root, pre);
return root;
}
};
2
本题也不难,在 求二叉搜索树的最小绝对差 和 众数 那两道题目 都讲过了 双指针法,思路是一样的。
https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1d44y1f7wP
**总结篇 **
好了,二叉树大家就这样刷完了,做一个总结吧
https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html