• 701、450、二叉搜索树的插入和删除


    插入

    给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

    注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

    示例 1:


    输入:root = [4,2,7,1,3], val = 5
    输出:[4,2,7,1,3,5]

     因为插入一个结点就修改了二叉树,所以要接收递归函数的返回值,类似于构造一棵二叉树。

    1. class Solution {
    2. public:
    3. TreeNode* insertIntoBST(TreeNode* root, int val) {
    4. if(root==nullptr)//找到空位置插入结点
    5. return new TreeNode(val);
    6. if(root->val>val)
    7. root->left=insertIntoBST(root->left,val);
    8. if(root->val
    9. root->right=insertIntoBST(root->right,val);
    10. return root;
    11. }
    12. };

     删除

    给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

    一般来说,删除节点可分为两个步骤:

    首先找到需要删除的节点;
    如果找到了,删除它。
     

    示例 1:

    输入:root = [5,3,6,2,4,null,7], key = 3
    输出:[5,4,6,2,null,null,7]
    解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
    一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
    另一个正确答案是 [5,2,6,null,4,null,7]。

    删除结点有三种情况:1.删除叶子结点  2.删除一度结点  3.删除二度结点 

    1. class Solution {
    2. public:
    3. TreeNode* deleteNode(TreeNode* root, int key)
    4. {
    5. if(root==nullptr)
    6. return nullptr;
    7. if(root->val==key)
    8. {
    9. //情况1、2全部解决。要删除的结点是叶子结点,左子树为空,返回右子树(null),删除成功;要删除的是一度结点,左子树为空或右子树为空,返回不为空的那棵子树,也成功删除
    10. if(root->left==nullptr) return root->right;
    11. if(root->right==nullptr) return root->left;
    12. //情况3,删除二度结点。找到左子树中最大的那个节点,或者右子树中最小的那个节点来接替要删除的结点
    13. //得到右子树最小的那个结点(先找到右子树,然后一直朝左走到尽头)
    14. TreeNode* r=root->right;
    15. while(r->left!=nullptr)
    16. r=r->left;
    17. //删除右子树中最小的结点
    18. root->right=deleteNode(root->right,r->val);
    19. //用右子树最小的结点来替换root结点(不采用直接交换root和r的val值的方式,而是通过指针操作交换结点,不关心内部存储的数据)
    20. r->left=root->left;//root的左子树接到r上
    21. r->right=root->right;//root的右子树接到r上
    22. root=r;//root指向r
    23. }
    24. else if(root->val>key)
    25. {
    26. root->left=deleteNode(root->left,key);
    27. }
    28. else if(root->val
    29. {
    30. root->right=deleteNode(root->right,key);
    31. }
    32. return root;
    33. }
    34. };
  • 相关阅读:
    运算符,switch
    力扣刷题 day53:10-23
    [附源码]Python计算机毕业设计SSM开放式在线课程教学与辅助平台(程序+LW)
    如何提升和扩展 PostgreSQL — 从共享缓冲区到内存数据网格
    给定一个整数数组 nums 和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
    C++与正则表达式
    vue-router滚动行为
    JsonPath详解
    JavaScript 中的一些奇怪问题
    Centos7上面安装uWSGI 部署项目测试
  • 原文地址:https://blog.csdn.net/weixin_50437588/article/details/126171092