• C++:二叉树进阶


    二叉搜索树

    二叉搜索树又称二叉排序树,它或者是一棵空树 ,或者是具有以下性质的二叉树 :
    若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
    若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
    它的左右子树也分别为二叉搜索树

    二叉搜索树操作

    1. 二叉搜索树的查找
    a 、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
    b 、最多查找高度次,走到到空,还没找到,这个值不存在。
    2. 二叉搜索树的插入
    插入的具体过程如下:
    a. 树为空,则直接新增节点,赋值给 root 指针
    b. 树不空,按二叉搜索树性质查找插入位置,插入新节点
    1. 二叉搜索树的删除
    首先查找元素是否在二叉搜索树中,如果不存在,则返回 , 否则要删除的结点可能分下面四种情
    况:
    a. 要删除的结点无孩子结点
    b. 要删除的结点只有左孩子结点
    c. 要删除的结点只有右孩子结点
    d. 要删除的结点有左、右孩子结点
    看起来有待删除节点有 4 中情况,实际情况 a 可以与情况 b 或者 c 合并起来,因此真正的删除过程
    如下:
    情况 b :删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点 -- 直接删除
    情况 c :删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点 -- 直接删除
    情况 d :在它的右子树中寻找中序下的第一个结点 ( 关键码最小 ) ,用它的值填补到被删除节点
    中,再来处理该结点的删除问题 -- 替换法删除

    二叉搜索树的实现

    1. template<class K>
    2. struct BSTreeNode
    3. {
    4. BSTreeNode* _left;
    5. BSTreeNode* _right;
    6. K _key;
    7. BSTreeNode(const K& key)
    8. :_left(nullptr)
    9. ,_right(nullptr)
    10. ,_key(key)
    11. {}
    12. };
    13. template<class K>
    14. class BSTree
    15. {
    16. typedef BSTreeNode Node;
    17. public:
    18. bool Insert(const K& key)
    19. {
    20. if (_root == nullptr)
    21. {
    22. _root = new Node(key);
    23. return true;
    24. }
    25. Node* parent = nullptr;
    26. Node* cur = _root;
    27. while (cur)
    28. {
    29. if (cur->_key < key)
    30. {
    31. parent = cur;
    32. cur = cur->_right;
    33. }
    34. else if (cur->_key > key)
    35. {
    36. parent = cur;
    37. cur = cur->_left;
    38. }
    39. else
    40. {
    41. return false;
    42. }
    43. }
    44. cur = new Node(key);
    45. if (parent->_key < key)
    46. {
    47. parent->_right = cur;
    48. }
    49. else
    50. {
    51. parent->_left = cur;
    52. }
    53. return true;
    54. }
    55. bool Find(const K& key)
    56. {
    57. Node* cur = _root;
    58. while (cur)
    59. {
    60. if (cur->_key < key)
    61. {
    62. cur = cur->_right;
    63. }
    64. else if (cur->_key > key)
    65. {
    66. cur = cur->_left;
    67. }
    68. else
    69. {
    70. return true;
    71. }
    72. }
    73. return false;
    74. }
    75. bool Erase(const K& key)
    76. {
    77. }
    78. void InOrder()
    79. {
    80. _InOrder(_root);
    81. }
    82. private:
    83. void _InOrder(Node* root)
    84. {
    85. if (root == nullptr)
    86. {
    87. return;
    88. }
    89. _InOrder(root->_left);
    90. cout << root->_key << " ";
    91. _InOrder(root->_right);
    92. }
    93. private:
    94. Node* _root = nullptr;
    95. };

  • 相关阅读:
    SQL注入原理及思路(mysql)
    【Python开发】一文详解Flask-Login
    VoLTE端到端业务详解 | 应用案例二
    【code】习惯使用 !=null 判空?试试 Java 8 的全新写法
    驱动开发:内核监视LoadImage映像回调
    babylon.js gltf scene hierarchy
    2022“金九银十”精选20道JVM面试重点问题及十大模块知识点笔记,看看你会多少?
    任务需求分析中的流程图、用例图、er图、类图、时序图线段、图形的作用意义
    2022年高教社杯国赛C题 | 古代玻璃制品的成分分析与鉴别(Matlab实现)
    静态代码块Vs构造代码块
  • 原文地址:https://blog.csdn.net/qq_66442539/article/details/138165884