提示信息

普通二叉搜索树的 C++ 模拟实现

小思绪 已关注

实现一个普通的二叉搜索树(Binary Search Tree,BST)是学习数据结构和算法的基本练习之一。下面是一个简单的 C++ 类,用于实现基本的二叉搜索树功能,包括插入、查找和删除节点。

  1. #include <iostream>
  2. // 定义节点结构
  3. struct TreeNode {
  4. int val;
  5. TreeNode *left;
  6. TreeNode *right;
  7. TreeNode(int value) : val(value), left(nullptr), right(nullptr) {}
  8. };
  9. class BinarySearchTree {
  10. public:
  11. BinarySearchTree() : root(nullptr) {}
  12. // 插入节点
  13. void insert(int value) {
  14. root = insert(root, value);
  15. }
  16. // 查找节点
  17. bool search(int value) {
  18. return search(root, value);
  19. }
  20. // 删除节点
  21. void remove(int value) {
  22. root = remove(root, value);
  23. }
  24. // 中序遍历
  25. void inorder() {
  26. inorder(root);
  27. std::cout << std::endl;
  28. }
  29. private:
  30. TreeNode* root;
  31. // 插入节点(递归实现)
  32. TreeNode* insert(TreeNode* node, int value) {
  33. if (node == nullptr) {
  34. return new TreeNode(value);
  35. }
  36. if (value < node->val) {
  37. node->left = insert(node->left, value);
  38. } else if (value > node->val) {
  39. node->right = insert(node->right, value);
  40. }
  41. return node;
  42. }
  43. // 查找节点(递归实现)
  44. bool search(TreeNode* node, int value) {
  45. if (node == nullptr) {
  46. return false;
  47. }
  48. if (value == node->val) {
  49. return true;
  50. } else if (value < node->val) {
  51. return search(node->left, value);
  52. } else {
  53. return search(node->right, value);
  54. }
  55. }
  56. // 删除节点(递归实现)
  57. TreeNode* remove(TreeNode* node, int value) {
  58. if (node == nullptr) {
  59. return nullptr;
  60. }
  61. if (value < node->val) {
  62. node->left = remove(node->left, value);
  63. } else if (value > node->val) {
  64. node->right = remove(node->right, value);
  65. } else {
  66. // 节点只有一个子节点或没有子节点
  67. if (node->left == nullptr) {
  68. TreeNode* temp = node->right;
  69. delete node;
  70. return temp;
  71. } else if (node->right == nullptr) {
  72. TreeNode* temp = node->left;
  73. delete node;
  74. return temp;
  75. }
  76. // 节点有两个子节点,找到中序遍历的后继节点
  77. TreeNode* temp = minValueNode(node->right);
  78. node->val = temp->val;
  79. node->right = remove(node->right, temp->val);
  80. }
  81. return node;
  82. }
  83. // 找到最小值节点
  84. TreeNode* minValueNode(TreeNode* node) {
  85. TreeNode* current = node;
  86. while (current && current->left != nullptr) {
  87. current = current->left;
  88. }
  89. return current;
  90. }
  91. // 中序遍历(递归实现)
  92. void inorder(TreeNode* node) {
  93. if (node != nullptr) {
  94. inorder(node->left);
  95. std::cout << node->val << " ";
  96. inorder(node->right);
  97. }
  98. }
  99. };
  100. int main() {
  101. BinarySearchTree bst;
  102. bst.insert(50);
  103. bst.insert(30);
  104. bst.insert(20);
  105. bst.insert(40);
  106. bst.insert(70);
  107. bst.insert(60);
  108. bst.insert(80);
  109. std::cout << "Inorder traversal: ";
  110. bst.inorder();
  111. std::cout << "Search 40: " << (bst.search(40) ? "Found" : "Not Found") << std::endl;
  112. std::cout << "Search 100: " << (bst.search(100) ? "Found" : "Not Found") << std::endl;
  113. std::cout << "Removing 20\n";
  114. bst.remove(20);
  115. std::cout << "Inorder traversal: ";
  116. bst.inorder();
  117. return 0;
  118. }

代码说明

  • TreeNode 结构体用于定义树的节点,每个节点有一个整型数值和指向左右子节点的指针。
  • BinarySearchTree 类实现了插入、查找、删除和中序遍历操作。
  • insert 函数递归地插入新节点。
  • search 函数递归地查找特定值的节点。
  • remove 函数处理节点的删除,包括三种情况:没有子节点、一个子节点、两个子节点。
  • inorder 函数递归地进行中序遍历并输出节点值。
  • 主函数中演示了二叉搜索树的插入、查找、删除和遍历功能。

你可以根据需要扩展该实现,添加更多功能或优化现有功能。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
小思绪 关注 已关注

最近一次登录:2024-12-19 11:24:20   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图