免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: yyaadet
打印 上一主题 下一主题

二叉搜索树的插入问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-07-14 13:14 |只看该作者

问题已经解决,代码如下


  1. binarytree.h
  2. struct tree
  3. {
  4.         int data;
  5.         int visited;      //0 visited ,1 unvisited
  6.         struct tree *left,*right;
  7. };
  8. typedef struct tree Tree;

  9. int bs_search(Tree *base , int key,Tree **p);
  10. void insert(Tree **base, int key);
  11. int delete_bst(Tree **base ,int key);

  12. int delete(Tree **p);
  13. void travel(Tree *base);  //inorder
  14. void initial(Tree **base);

  15. binarytree.c
  16. #include<stdio.h>
  17. #include<stdlib.h>
  18. #include "binarytree.h"

  19. //1 declare success ,0 declare fail
  20. int bs_search(Tree *base , int key,Tree **p)
  21. {
  22.         if(base==NULL)
  23.         {
  24.                 *p=NULL;
  25.                 return 0;
  26.         }
  27.         else
  28.         {
  29.                 Tree *temp,*parent;
  30.                 temp=base;
  31.                 while(temp!=NULL)
  32.                 {
  33.                         if(temp->data==key)
  34.                         {
  35.                                 *p=temp;
  36.                                 return 1;
  37.                         }
  38.                         else if(temp->data<key)
  39.                         {
  40.                                 parent=temp;
  41.                                 temp=temp->right;
  42.                         }
  43.                         else
  44.                         {
  45.                                 parent=temp;
  46.                                 temp=temp->left;
  47.                         }
  48.                 }
  49.                 *p=parent;
  50.                 return 0;
  51.         }
  52. }

  53. void insert(Tree **base,int key)
  54. {
  55.         Tree **p;
  56.         Tree *temp;
  57.         p=(Tree **)malloc(sizeof(Tree));
  58.         if(bs_search(*base,key,p)==0)
  59.         {
  60.                 Tree *s=(Tree *)malloc(sizeof(Tree));
  61.                 s->right=s->left=NULL;
  62.                 s->data=key;
  63.                 s->visited=0;
  64.                 if(*p==NULL)
  65.                 {
  66.                         *base=s;
  67.                 }
  68.                 else if(key>(*p)->data)
  69.                 {
  70.                         temp=*p;
  71.                         temp->right=s;
  72.                 }
  73.                 else
  74.                 {
  75.                         temp=*p;
  76.                         temp->left=s;
  77.                 }
  78.         }
  79.         free(p);
  80. }

  81. void travel(Tree *base)
  82. {
  83.         if(base==NULL)
  84.                 return;
  85.         else if(base->visited==0)
  86.         {
  87.                 base->visited=1;
  88.                 travel(base->left);
  89.                 printf(" %d ",base->data);
  90.                 travel(base->right);
  91.         }
  92. }

  93. int delete_bst(Tree **base , int key)
  94. {
  95.         if(*base==NULL)
  96.                 return 0;
  97.         else if(key==(*base)->data)
  98.                 return delete(base);
  99.         else if(key>(*base)->data)
  100.                 return delete(&((*base)->right));
  101.         else
  102.                 return delete(&((*base)->left));
  103. }

  104. int delete(Tree **p)
  105. {
  106.         Tree *q;
  107.         if((*p)->right==NULL)
  108.         {
  109.                 q=*p;
  110.                 *p=(*p)->left;
  111.                 free(q);
  112.         }
  113.         else if((*p)->left==NULL)
  114.         {
  115.                 q=*p;
  116.                 *p=(*p)->right;
  117.                 free(q);
  118.         }
  119.         else
  120.         {
  121.                 Tree *s;
  122.                 q=*p;
  123.                 s=(*p)->left;
  124.                 while(s->right!=NULL)
  125.                 {
  126.                         q=s;
  127.                         s=s->right;
  128.                 }
  129.                 (*p)->data=s->data;
  130.                 if(q!=*p)
  131.                         q->right=s->left;
  132.                 else
  133.                         q->left=s->left;
  134.                 free(s);
  135.         }
  136.         return 1;
  137. }

  138. void initial(Tree **base)
  139. {
  140.         if(*base==NULL)
  141.                 return;
  142.         (*base)->visited=0;
  143.         initial(&((*base)->left));
  144.         initial(&((*base)->right));
  145. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP