幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2408|回复: 0

[通用编程] 问个二叉排序树的问题

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2008-4-27 23:13:03 | 显示全部楼层 |阅读模式
程序如下:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 100
  4. #define MaxWidth 40
  5. typedef struct node
  6. {
  7.     char data;
  8.     struct node *left,*right;
  9. }BTree;
  10. BTree *creatree(char str[],int n)
  11. {
  12.     int i;
  13.     BTree *BT=NULL,*p,*s;
  14.     for(i=0;i<n;i++)
  15.     {
  16.         s=(BTree *)malloc(sizeof(BTree));
  17.         s->data=str[i];s->left=s->right=NULL;
  18.         p=BT;
  19.         if(p==NULL)
  20.             BT=s;
  21.         else
  22.         {
  23.             while(p->left!=s && p->right!=s)
  24.             {
  25.                 if(s->data < p->data)
  26.                 {
  27.                     if(p->left!=NULL)
  28.                         p=p->left;
  29.                     else
  30.                         p->left=s;
  31.                 }
  32.                 else
  33.                 {
  34.                     if(p->right!=NULL)
  35.                         p=p->right;
  36.                     else
  37.                         p->right=s;
  38.                 }
  39.             }
  40.         }
  41.     }
  42.     return(BT);
  43. }
  44. BTree *find(BTree *BT,int x) //寻找元素
  45. {
  46.     BTree *p=BT;
  47.     while(p!=NULL && p->data!=x)
  48.     {
  49.         if(x<p->data)
  50.             p=p->left;
  51.         else
  52.             p=p->right;
  53.     }
  54.     return p;
  55. }
  56. void del(BTree **BT,int x)
  57. {
  58.     BTree *p=*BT,*q,*r,*t;
  59.     q=NULL;
  60.     while(p!=NULL && p->data!=x)
  61.         if(x < p->data)
  62.         {
  63.             q=p;
  64.             p=p->left;
  65.         }
  66.         else
  67.         {
  68.             q=p;p=p->right;
  69.         }
  70.         if(p==NULL)
  71.             printf("未发现数据为%d的结点\n",x);
  72.         else if(p->left==NULL) //删除点无左子树
  73.         {
  74.             if(q==NULL)  //删除点是根结点
  75.                 t=p->right;
  76.             else if(q->left==p)
  77.                 q->left=p->right;
  78.             else
  79.                 q->right=p->right;
  80.         }
  81.         else
  82.         {
  83.             r=p->left;
  84.             while(r->right!=NULL)
  85.                 r=r->right;
  86.             r->right=p->right;
  87.             if(q==NULL) t=p->left;    //删除点是根结点
  88.             else if(q->left==p) q->left=p->left;
  89.             else q->right=p->left;
  90.         }
  91. }
  92. void disptree(BTree *BT)  //前序法显示二叉树
  93. {
  94.     BTree *stack[MaxSize],*p;
  95.     int level[MaxSize][2],top,n,i,width=4;
  96.     if(BT!=NULL)
  97.     {
  98.         printf("\n凹入表示法:\n");
  99.         top=1;
  100.         stack[top]=BT;
  101.         level[top][0]=width;
  102.         while(top>0)
  103.         {
  104.             p=stack[top];
  105.             n=level[top][0];
  106.             for(i=1;i<=n;i++)
  107.                 printf(" ");
  108.             printf("%c",p->data);
  109.             for(i=n+1;i<=MaxWidth;i+=2)
  110.                 printf("-");
  111.             printf("\n");
  112.             top--;
  113.             if(p->right!=NULL)
  114.             {
  115.                 top++;
  116.                 stack[top]=p->right;
  117.                 level[top][0]=n+width;
  118.                 level[top][1]=2;
  119.             }
  120.             if(p->left!=NULL)
  121.             {
  122.                 top++;
  123.                 stack[top]=p->left;
  124.                 level[top][0]=n+width;
  125.                 level[top][1]=1;
  126.             }
  127.         }
  128.     }
  129. }
  130. void main()
  131. {
  132.     BTree *B,*p;
  133.     char str[]={'4','5','2','1','6','9','3','8'};
  134.     printf("初始化二叉树:");
  135.     B=creatree(str,8);
  136.     disptree(B);
  137.     p=find(B,'1');
  138.     if(p==NULL) printf("值域为1的结点未找到!\n");
  139.     else printf("值域为1的结点存在!\n");
  140.     del(&B,'4');
  141.     disptree(B);
  142. }
复制代码

删除的过程是:先找到要删除的结点, 如果删除点没有左子树,则用右子树代替被删点,  如果删除点有左子树则在其左子树中找到最右结点来代替被删的结点.(即将那最右的结点的右指针置成删除点所指结点的右子树的根,然后用删除点的左子树的根结点代替被删除点所指的结点.)

在这一句del(&B,'4');  删除的是根结点(最顶那个结点)的时候,结果怎么那么奇怪呢?好像对,又好像不对,
还有它判断是否根结点的这一句 if(q==NULL) t=p->left;  t 好像只是接收p的left 但并没有改变 树原来的结构啊? 到底应该怎么去理解呢???
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-30 04:54 , Processed in 0.020610 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表