二叉搜索树的实现

 二叉搜索树的删除:

       (1)、没有左孩子,直接把右孩子替代删除结点

       (2)、有左孩子但左孩子没有右孩子,则把左孩子替代删除结点

       (3)、其它,把左孩子的最大的结点替代删除结点

       时间复杂度O(logn)

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3.   
  4. struct node {  
  5.     node* left;  
  6.     node* right;  
  7.     int val;  
  8. };  
  9.   
  10. node* ins(node* p, int val) {  
  11.     if (p == NULL) {  
  12.         node* q = (node*)malloc(sizeof(node));  
  13.         q->left = q->right = NULL;  
  14.         q->val = val;  
  15.         return q;  
  16.     } else {  
  17.         if (p->val > val) {  
  18.             p->left = ins(p->left, val);  
  19.         } else {  
  20.             p->right = ins(p->right, val);  
  21.         }  
  22.   
  23.         return p;  
  24.     }  
  25. }  
  26.   
  27. bool find(node* p, int val) {  
  28.     if (p == NULL) {  
  29.         return false;  
  30.     } else if (p->val == val) {  
  31.         return true;  
  32.     } else if (p->val > val) {  
  33.         return find(p->left, val);  
  34.     } else {  
  35.         return find(p->right, val);  
  36.     }  
  37. }  
  38.   
  39. node* del(node* p, int val) {  
  40.     if (p == NULL) {  
  41.         return NULL;  
  42.     } else if (p->val > val) {  
  43.         p->left = del(p->left, val);  
  44.     } else if (p->val < val) {  
  45.         p->right = del(p->right, val);  
  46.     } else if (p->left == NULL) {  
  47.         node* q = p->right;  
  48.         free(p);  
  49.         return q;  
  50.     } else if (p->left->right == NULL) {  
  51.         node* q = p->left;  
  52.         q->right = p->right;  
  53.         free(p);  
  54.         return q;  
  55.     } else {  
  56.         node* q;  
  57.         for (q = p->left; q->right->right != NULL; q = q->right) ;  
  58.         node* r = q->right;  
  59.         q->right = r->left;  
  60.         r->left = p->left;  
  61.         r->right = p->right;  
  62.         free(p);  
  63.         return r;  
  64.     }  
  65.   
  66.     return p;  
  67. }  
  68.   
  69. int main() {  
  70.     int a[] = {7, 2, 15, 1, 5, 4, 6, 10, 17, 8, 11, 16, 19};  
  71.     int len, i;  
  72.     node root;  
  73.   
  74.     root.left = root.right = NULL;  
  75.     root.val = 0;  
  76.   
  77.     len = sizeof(a) / sizeof(int);  
  78.     for (i = 0; i < len; i++) {  
  79.         ins(&root, a[i]);  
  80.     }  
  81.   
  82.     if (find(&root, 15)) {  
  83.         printf("15 exists\n");  
  84.     }  
  85.   
  86.     del(&root, 15);  
  87.     if (!find(&root, 15)) {  
  88.         printf("15 not exists\n");  
  89.     }  
  90.   
  91.     return 0;  
  92. }  

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值