• 【20221105】【每日一题】删除二叉搜索树中的节点


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

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

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


     思路:在找到要删除的点后,分为几种情况,其中节点的左右孩子均不为空的时候复杂一点,要考虑的左右孩子都可能不为一层,统一化的办法就是用右孩子去继承,将左孩子放在右孩子的最左侧的节点下面,这样可以保证重构后仍然为二叉搜索树。

    这里的终止条件也要注意一下,不需要将整个二叉树都遍历完,找到目标点就可以了。

    1. class Solution {
    2. public:
    3. TreeNode* deleteNode(TreeNode* root, int key) {
    4. if(root==NULL) return NULL;
    5. //找到删除节点的情况
    6. if(root->val==key)
    7. {
    8. //1.删除的节点正好为叶子节点,直接删除即可
    9. if(root->left==NULL&&root->right==NULL)
    10. {
    11. delete root;
    12. return NULL;
    13. }
    14. //2.删除的节点有一个孩子,让那个孩子来代替它的位置
    15. else if(root->left==NULL&&root->right!=NULL)
    16. {
    17. TreeNode* reNode=root->right;
    18. delete root;
    19. return reNode;
    20. }
    21. else if(root->left!=NULL&&root->right==NULL)
    22. {
    23. TreeNode* reNode=root->left;
    24. delete root;
    25. return reNode;
    26. }
    27. //3.删除的节点有两个孩子,这时候其实有不同的构造方式,这里就统一一下
    28. //用右孩子代替被删除的节点,左孩子成为新节点的左孩子
    29. //注意这里如果删除的节点下面不止一层,(自己考虑的时候就漏了这类情况)
    30. //将整个左子树放在右子树的最左侧的节点下面,可以保证为二叉搜索树
    31. else
    32. {
    33. TreeNode* cur=root->right;
    34. //cur指向右子树的最左侧的节点
    35. while(cur->left)
    36. {
    37. cur=cur->left;
    38. }
    39. cur->left=root->left;
    40. root=root->right;
    41. return root;
    42. }
    43. }
    44. if(root->val>key) root->left=deleteNode(root->left,key);
    45. if(root->valright=deleteNode(root->right,key);
    46. return root;
    47. }
    48. };

  • 相关阅读:
    算法通关村-----海量数据的处理方法
    AI在工业机器人系统中的应用
    高级运维学习(九)块存储、文件系统存储和对象存储的实现
    基于 json-server 工具,模拟实现后端接口服务环境
    Boostrap对HTML的表格的设计和优化
    java计算机毕业设计记事网页(附源码、数据库)
    类模板Array带二个模板参数
    JVM详解-栈&堆
    React-native android App项目搭建
    二分搜索算法框架解析
  • 原文地址:https://blog.csdn.net/HYAIWYH/article/details/127703704