提示信息

C++中的二叉搜索树基础

於城 已关注

二叉搜索树(Binary Search Tree,简称 BST)是一种特殊的二叉树结构,它具有以下几个特点:

  1. 每个节点最多有两个子节点。
  2. 左子树上所有节点的值都小于根节点的值。
  3. 右子树上所有节点的值都大于根节点的值。
  4. 左右子树本身也是二叉搜索树。

二叉搜索树可以用来高效地查找、插入和删除数据,时间复杂度平均为 O(log n),但在最坏的情况下(例如,输入数据是已排序的),时间复杂度会退化到 O(n)。

下面是一个简单的 C++ 实现二叉搜索树的示例,包括节点定义、插入和查找操作:

  1. #include <iostream>
  2. // 定义二叉搜索树的节点结构
  3. struct TreeNode {
  4. int value;
  5. TreeNode* left;
  6. TreeNode* right;
  7. TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
  8. };
  9. // 插入新节点到二叉搜索树
  10. TreeNode* insert(TreeNode* root, int value) {
  11. if (root == nullptr) {
  12. return new TreeNode(value);
  13. }
  14. if (value < root->value) {
  15. root->left = insert(root->left, value);
  16. } else if (value > root->value) {
  17. root->right = insert(root->right, value);
  18. }
  19. return root;
  20. }
  21. // 查找二叉搜索树中的值
  22. bool search(TreeNode* root, int value) {
  23. if (root == nullptr) {
  24. return false;
  25. }
  26. if (value == root->value) {
  27. return true;
  28. } else if (value < root->value) {
  29. return search(root->left, value);
  30. } else {
  31. return search(root->right, value);
  32. }
  33. }
  34. // 递归释放内存
  35. void deleteTree(TreeNode* root) {
  36. if (root == nullptr) {
  37. return;
  38. }
  39. deleteTree(root->left);
  40. deleteTree(root->right);
  41. delete root;
  42. }
  43. int main() {
  44. TreeNode* root = nullptr;
  45. // 插入节点
  46. root = insert(root, 50);
  47. insert(root, 30);
  48. insert(root, 20);
  49. insert(root, 40);
  50. insert(root, 70);
  51. insert(root, 60);
  52. insert(root, 80);
  53. // 搜索节点
  54. std::cout << "Search 40: " << (search(root, 40) ? "Found" : "Not Found") << std::endl;
  55. std::cout << "Search 25: " << (search(root, 25) ? "Found" : "Not Found") << std::endl;
  56. // 释放内存
  57. deleteTree(root);
  58. return 0;
  59. }

插入操作

  • 从树根开始,将待插入节点的值与当前节点的值相比较。
  • 如果小于当前节点的值,则递归地向左子树插入。
  • 如果大于当前节点的值,则递归地向右子树插入。
  • 如果等于当前节点的值,通常忽略插入以避免重复元素(可以根据需求调整)。

查找操作

  • 和插入类似,从树根开始比较目标值与当前节点的值。
  • 如果小于当前节点的值,递归地在左子树查找。
  • 如果大于当前节点的值,递归地在右子树查找。
  • 如果找到了相等的值,返回 true,否则为 false。

这些基本操作可以扩展为更加复杂的功能,比如删除节点、遍历树等等。如果你有任何具体问题或进阶需求,可以在问答社区中提问!

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

最近一次登录:2024-11-20 16:17:31   

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