二叉排序树M

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define OK 1
  4 #define TRUE 1
  5 #define FALSE 0
  6 #define ERROR -1
  7 #define OVERFLOW -2
  8 typedef int Status;
  9 typedef int KeyType; 
 10 typedef int TElemType;
 11 typedef struct BiTNode{
 12     TElemType data;
 13     BiTNode *lchild,*rchild;
 14 }BiTNode,*BiTree;
 15 Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p)
 16 {
 17     if(!T) {p=f;return FALSE;}
 18     else if(key==T->data) {p=T;return TRUE;}
 19     else if(key<T->data) return SearchBST(T->lchild,key,T,p);
 20     else return SearchBST(T->rchild,key,T,p);
 21 }
 22 Status InsertBST(BiTree &T,TElemType e)
 23 {
 24     BiTree p,s;
 25     if(!SearchBST(T,e,NULL,p))
 26     {
 27         s=(BiTree)malloc(sizeof(BiTNode));
 28         s->data=e;
 29         s->lchild=s->rchild=NULL;
 30         if(!p) T=s;
 31         else if(e<p->data) p->lchild=s;
 32         else p->rchild=s;
 33         return TRUE;
 34     }
 35     else 
 36     {
 37         puts("二叉排序树中已经存在该元素!");
 38         return FALSE;
 39     } 
 40 }
 41 Status Delete(BiTree &p)
 42 {
 43     BiTree s,q;
 44     if(!p->rchild)
 45     {
 46         q=p;p=p->lchild;
 47         free(q);
 48     }
 49     else if(!p->lchild)
 50     {
 51         q=p;p=p->rchild; 
 52         free(q);
 53     }
 54     else
 55     {
 56         q=p;s=p->lchild;
 57         while(s->rchild)
 58         {
 59            q=s;s=s->rchild;
 60         }
 61         p->data=s->data;
 62         if(q!=p) q->rchild=s->lchild;
 63         else q->lchild=s->lchild;
 64         free(s);
 65     }
 66     return TRUE;
 67 }
 68 Status DeleteBST(BiTree &T,KeyType key)
 69 {
 70     if(!T) return FALSE;
 71     else
 72     {
 73         if(key==T->data) return Delete(T);
 74         else if(key<T->data) return DeleteBST(T->lchild,key);
 75         else return  DeleteBST(T->rchild,key);
 76     }
 77 }
 78 Status CreateBiTree(BiTree &T)
 79 {
 80     int i,n;
 81     TElemType treeElem[100];
 82     T=NULL;
 83     puts("请输入你要创建的二叉排序树的结点个数:");
 84     scanf("%d",&n); 
 85     puts("请输入结点数值:");
 86     for(i=0;i<n;i++)
 87     {
 88         scanf("%d",&treeElem[i]);
 89         InsertBST(T,treeElem[i]);
 90     }
 91     return OK;
 92 }
 93 void PreOrderTraverse(BiTree T)
 94 {
 95    if(T)
 96    {
 97        printf("%d ",T->data);
 98        PreOrderTraverse(T->lchild);
 99        PreOrderTraverse(T->rchild);
100    }
101 }
102 void InOrderTraverse(BiTree T)
103 {
104    if(T)
105    {
106        InOrderTraverse(T->lchild);
107        printf("%d ",T->data);
108        InOrderTraverse(T->rchild);
109    }
110 }
111 void PostOrderTraverse(BiTree T)
112 {
113    if(T)
114    {
115        PostOrderTraverse(T->lchild);
116        PostOrderTraverse(T->rchild); 
117        printf("%d ",T->data);
118    }
119 }
120 int CountLeaf(BiTree T)
121 {
122     int count=0;
123     if(T)
124     {
125       if(!(T->lchild||T->rchild))
126       count++;
127       count+=CountLeaf(T->lchild);
128       count+=CountLeaf(T->rchild);
129     }
130     return count;
131 }
132 int Depth(BiTree T)
133 { 
134    int depthval;
135    int depthLeft,depthRight;
136    if(!T) depthval=0;
137    else   
138    {
139         depthLeft=Depth(T->lchild);
140         depthRight=Depth(T->rchild);
141         depthval=1+(depthLeft>depthRight?depthLeft:depthRight);
142    }    
143    return depthval;
144 }
145 Status PrintTreeInfo(BiTree T) 
146 {
147     puts("当前排序二叉树为:"); 
148     puts("前序遍历排序二叉树:"); 
149     PreOrderTraverse(T);
150     puts("\n中序遍历排序二叉树:");
151     InOrderTraverse(T);
152     puts("\n后序遍历排序二叉树:");
153     PostOrderTraverse(T);
154     printf("\n排序二叉树的叶子个数为:%d\n",CountLeaf(T));
155     printf("排序二叉树的深度为:%d\n",Depth(T));
156     putchar('\n'); 
157     return OK;
158 }
159 Status DestroyBiTree(BiTree &T)
160 {
161    if(T)
162    {
163      DestroyBiTree(T->lchild);
164      DestroyBiTree(T->rchild);
165      delete T;
166      T=NULL;
167    }
168    return OK;
169 }
170 Status main()
171 {
172     BiTree T;
173     TElemType e;
174     CreateBiTree(T);
175     PrintTreeInfo(T);
176     puts("请输入你要插入的结点的值:");
177     scanf("%d",&e);
178     InsertBST(T,e);
179     PrintTreeInfo(T);
180     puts("请输入你要删除的结点的值:");
181     scanf("%d",&e); 
182     DeleteBST(T,e);
183     PrintTreeInfo(T);
184     DestroyBiTree(T);
185     system("pause"); 
186     return OK;
187 }

posted on 2012-08-03 08:19  mycapple  阅读(364)  评论(0编辑  收藏  举报

导航