• 力扣第669题 修剪二叉搜索树 c++(注释)


    题目

    669. 修剪二叉搜索树

    中等

    相关标签

       深度优先搜索   二叉搜索树   二叉树

    给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

    所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

    示例 1:


    输入:root = [1,0,2], low = 1, high = 2
    输出:[1,null,2]
    

    示例 2:

    输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
    输出:[3,2,null,1]

    提示:

    • 树中节点数在范围 [1, 104] 内
    • 0 <= Node.val <= 104
    • 树中每个节点的值都是 唯一 的
    • 题目数据保证输入是一棵有效的二叉搜索树
    • 0 <= low <= high <= 104

    思路和解题方法

    给定一个BST的根节点root以及一个范围[low, high],修剪BST使得所有节点的值都在这个范围内。

    • 首先,进行边界情况判断,如果根节点为空,直接返回空指针。
    • 然后,判断根节点的值与范围的关系。
      • 如果根节点的值小于范围的下界low,说明根节点以及它的左子树都应该被修剪掉,因此递归调用trimBST函数,在右子树中继续修剪。
      • 如果根节点的值大于范围的上界high,说明根节点以及它的右子树都应该被修剪掉,因此递归调用trimBST函数,在左子树中继续修剪。
    • 若根节点的值在[low, high]范围内,则递归修剪左右子树,将修剪后的左右子树连接到根节点上。
    • 最后,返回修剪后的根节点。

    通过不断递归地修剪左右子树,最终得到修剪后的BST。

    复杂度

            时间复杂度:

                    O(n)

    时间复杂度:假设树中有n个节点,那么每个节点都需要被遍历一次,因此时间复杂度为O(n)。

            空间复杂度

                    O(n)

    空间复杂度:在递归过程中,使用了系统栈来保存每个递归调用的上下文信息。最坏情况下,树的高度为n,即退化为链表,此时递归调用的深度为n,所需的额外空间也为O(n)。因此,空间复杂度为O(n)。

    c++ 代码

    1. class Solution {
    2. public:
    3. TreeNode* trimBST(TreeNode* root, int low, int high) {
    4. // 如果根节点为空,返回空指针
    5. if(root == NULL) return NULL;
    6. // 如果根节点的值小于low,那么修剪BST应该在右子树中进行
    7. if(root->val < low)
    8. {
    9. return trimBST(root->right, low, high);
    10. }
    11. // 如果根节点的值大于high,那么修剪BST应该在左子树中进行
    12. if(root->val > high)
    13. {
    14. return trimBST(root->left, low, high);
    15. }
    16. // 若根节点的值在[low, high]范围内,则递归修剪左右子树
    17. root->left = trimBST(root->left, low, high);
    18. root->right = trimBST(root->right, low, high);
    19. // 返回修剪后的根节点
    20. return root;
    21. }
    22. };

    c++精简代码

    1. class Solution {
    2. public:
    3. TreeNode* trimBST(TreeNode* root, int low, int high) {
    4. if (root == nullptr) return nullptr;
    5. if (root->val < low) return trimBST(root->right, low, high);
    6. if (root->val > high) return trimBST(root->left, low, high);
    7. root->left = trimBST(root->left, low, high);
    8. root->right = trimBST(root->right, low, high);
    9. return root;
    10. }
    11. };

    觉得有用的话可以点点赞,支持一下。

    如果愿意的话关注一下。会对你有更多的帮助。

    每天都会不定时更新哦  >人<  。

  • 相关阅读:
    TCP 可靠性的关键机制 —— 确认应答机制 (ACK)
    Centos5.4下安装Layer7禁止QQ、MSN、p2p软件
    数据库优化(8月27号)
    MySQL(变量 存储过程 触发器 函数)
    【实习】Mockito + JUnit5 单元测试学习
    MySQL 与 PostgreSQL的区别
    期货开户公司行情资讯及时高效
    注解@TableField(value)
    Java(十二)---认识异常
    ESP32网络开发实例-使用NTP获取当前时间
  • 原文地址:https://blog.csdn.net/jgk666666/article/details/133815731