找回密码
 立即注册
首页 业界区 科技 简易BST实现

简易BST实现

昝梓菱 7 天前
BST,即二叉搜索树,该数据结构规定任意若一个结点存在左子树,那么该结点键必须要大于左子树上所有键;若有右子树,那么该结点键必须要小于右子树上所有键
简单的BST是树形查找里的入门级数据结构,不涉及平衡性调节,只需要简单插入删除,即可,其中删除稍复杂,但是也不难,只需要把三种情况分清即可。简单的BST因为不存在平衡调节,所以针对某些特定序列(如已排序序列依次插入)在构造好BST后,事实上退化为链表,这样搜索效率大幅下降到O(n)
今天先贴个简单BST实现,改天再贴个AVL树的实现
  1. typedef struct BSTnode {
  2.     struct BSTnode *left, *right;
  3.     int data;
  4. }BSTnode, *BST;
  5. //simple BST
  6. BST batch_create_BST(int a[], int n);
  7. void destroy_BST(BST &T);
  8. bool insert_BST(BST &T, int e);
  9. bool delete_BST(BST &T, int e);
  10. bool find_BST(BST &T, int e);
  11. BST batch_create_BST(int a[], int n)
  12. {
  13.     BST T = nullptr;
  14.     for (int i = 0; i < n; ++i)
  15.         insert_BST(T, a[i]);
  16.     return T;
  17. }
  18. void destroy_BST(BST &T)
  19. {
  20.     if (!T)
  21.         return;
  22.     destroy_BST(T->left);
  23.     destroy_BST(T->right);
  24.     free(T);
  25.     T = nullptr;
  26. }
  27. bool insert_BST(BST &T, int e)
  28. {
  29.     if (!T)
  30.     {
  31.         T = (BSTnode *)malloc(sizeof(BSTnode));
  32.         T->data = e;
  33.         T->left = T->right = nullptr;
  34.         return true;
  35.     }
  36.     if (e > T->data)
  37.         return insert_BST(T->right, e);
  38.     else if (e < T->data)
  39.         return insert_BST(T->left, e);
  40.     return false;
  41. }
  42. bool delete_BST(BST &T, int e)
  43. {
  44.     if (!T) // 空树删除失败
  45.         return false;
  46.     if (T->data == e) // 特殊处理根节点删除
  47.     {
  48.         if (T->left && T->right) // 根有左右子树
  49.         {
  50.             BSTnode *p = T, *q = T->left;
  51.             while (q->right) // 找到根节点的前驱以及前驱的父结点
  52.             {
  53.                 p = q;
  54.                 q = q->right;
  55.             }
  56.             T->data = q->data; // 覆盖根的元素
  57.             // 以下删除q
  58.             if (p->left == q)
  59.                 p->left = q->left != nullptr ? q->left : q->right; // 这里可以处理叶节点情况
  60.             else
  61.                 p->right = q->left != nullptr ? q->left : q->right; // 同上
  62.             free(q);
  63.             q = nullptr;
  64.         }
  65.         else // 仅有左或右子树以及叶结点情况
  66.         {
  67.             BSTnode *del = T;
  68.             T = T->left != nullptr ? T->left : T->right; // 事实上这里也能处理单节点情况
  69.             free(del);
  70.             del = nullptr;
  71.         }
  72.     }
  73.     else // 删除内部结点
  74.     {
  75.         BSTnode *p = nullptr, *q = T;
  76.         while (q && q->data != e) // 查找待删除结点及其父结点
  77.         {
  78.             p = q;
  79.             q = q->data > e ? q->left : q->right;
  80.         }
  81.         if (!q) // 没有这个结点删除失败
  82.             return false;
  83.         if (q->left && q->right) // 具有左右子树的结点删除
  84.         {
  85.             BSTnode *pre = q, *del = q->left;
  86.             while (del->right) // 寻找待删除结点的中序直接前驱以及这个前驱的父结点
  87.             {
  88.                 pre = del;
  89.                 del = del->right;
  90.             }
  91.             q->data = del->data; // 前驱直接覆盖原本待删除结点
  92.             // 以下删除del
  93.             if (pre->left == del)
  94.                 pre->left = del->left != nullptr ? del->left : del->right; // 可以处理叶结点情况
  95.             else
  96.                 pre->right = del->left != nullptr ? del->left : del->right;
  97.             ; // 同上
  98.             free(del);
  99.             del = nullptr;
  100.         }
  101.         else    // 仅有单子树的结点或叶结点删除
  102.         {
  103.             if (p->left == q)
  104.                 p->left = q->left != nullptr ? q->left : q->right; // 根据这里可以将前面的叶结点删除作优化掉
  105.             else
  106.                 p->right = q->left != nullptr ? q->left : q->right; // 同上
  107.             free(q);
  108.             q = nullptr;
  109.         }
  110.     }
  111.     return true;
  112. }
  113. bool find_BST(BST &T, int e)
  114. {
  115.     BSTnode *p = T;
  116.     while (p)
  117.     {
  118.         if (e > p->data)
  119.             p = p->right;
  120.         else if (e < p->data)
  121.             p = p->left;
  122.         else
  123.             break;
  124.         ;
  125.     }
  126.     if (p)
  127.         return true;
  128.     else
  129.         return false;
  130. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册