Day21| 669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、二叉树总结

2025-07-29

669.修剪二叉搜索树

题目链接:669.修剪二叉搜索树
文档讲解:代码随想录
状态:据说很难,但是轻松AC

思路

注意二叉搜索树的性质,当某一节点很小时,他的左子树要删掉,右子树待定;反之同理

题解

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root == nullptr)return root;
        if(root->val<low)return trimBST(root->right, low, high);
        else if(root->val>high)return trimBST(root->left, low, high);
        else
        {
            root->left = trimBST(root->left, low, high);
            root->right = trimBST(root->right, low, high);
            return root;
        }
    }
};

108.将有序数组转换为二叉搜索树

题目链接:108.将有序数组转换为二叉搜索树
文档讲解:代码随想录
状态:轻松AC

思路

本题考虑到平衡二叉树,其定义为:该树所有节点的左右子树高度相差不超过1

平衡二叉树每一个子树都要满足高度要求,所以其外观有一点点像完全二叉树,这里一开始有误区!!!

平衡二叉搜索树一定和中序遍历、二分查找联系起来,所以问题转变为了找中间节点(左右相差最多1个,不影响平衡性),然后是常规的递归建树问题。

题解

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if(nums.empty())return nullptr;
        int mid = nums.size()/2;
        TreeNode* root = new TreeNode(nums[mid]);
        vector<int> left(nums.begin(),nums.begin()+mid);
        vector<int> right(nums.begin()+mid+1,nums.end());
        root->left = sortedArrayToBST(left);
        root->right = sortedArrayToBST(right);
        return root;
    }
};

538.把二叉搜索树转换为累加树

题目链接:538.把二叉搜索树转换为累加树
文档讲解:代码随想录
状态:理清递归顺序与要求,轻松AC

思路

本题要求使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和,所以遍历顺序从大到小->故推出递归顺序为右中左

在右中左遍历过程中,当前节点的值等于当前节点加上上一个节点,要和父节点连接起来,妥妥的pre节点没毛病!

题解

class Solution {
public:
    TreeNode* pre = nullptr;
    TreeNode* convertBST(TreeNode* root) {
        if(root == nullptr)return nullptr;
        //右中左
        root->right = convertBST(root->right);
        if(pre!=nullptr)root->val = root->val+pre->val;
        pre = root;
        root->left = convertBST(root->left);
        return root;
  
    }
};

二叉树总结

👏👏👏超长的二叉树章节终于结束了!👏👏👏

来总结一下吧 ······

二叉树的种类

得先知道二叉树是啥子吧,对于算法题目来说,几乎所有的树都是链式法则,也就是一个节点有左右两个指针。所以,想玩转二叉树,先熟悉链表的操作吧!

二叉树里面有个特殊的:搜索树,他的性质异常重要,因为其有序性,所以在搜索时有方向性。处理该树用的最多的是中序遍历+pre指针。

当严格按照二分法时,搜索树就变成了较为漂亮的平衡搜索树,也要了解其构建过程哦!

二叉树的遍历方式

👀二叉树就是根节点+左子树+右子树,右子树呢?等于根节点+左子树+右子树······子子孙孙无穷尽矣(好像不对,到了空节点就穷尽了),这引出了递归法,也是最关键最重要的思想!

二叉树的递归遍历分为前序、中序、后续遍历,都是深度优先搜素;关键在于处理节点的位置在哪里,灵活运用解题,要多理解。

还有一个是层序遍历,这个太熟啦,就是队列的应用,也很巧妙。

做题还得是递归,就是子树就是魔怔

题目类型

  • 二叉树属性
    • 对称问题
    • 深度问题
    • 高度问题
    • 节点数量
    • 查找节点
    • 查找路径
    • 平衡性
    • 叶子节点问题
    • 公共祖先问题
  • 二叉树修改与构造
    • 翻转问题
    • 构造问题
    • 合并问题
    • 插入问题
    • 删除问题
  • 二叉搜索树
    • 搜索问题
    • 判断问题
    • 相邻大小比较

最后总结

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

  • 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

所以求普通二叉树的属性还是要具体问题具体分析。

二叉树专题汇聚为一张图:

chart

图片来源于 知识星球-青