二叉排序树

searchBST.h

  1 #ifndef SEARCHBST_H
  2 #define SERACHBST_H
  3 
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <malloc.h>
  7 #include <queue>
  8 
  9 typedef int ElemType;
 10 typedef enum{ERROR,OK}Status;
 11 typedef int KeyType;
 12 
 13 typedef struct BiNode
 14 {
 15     ElemType data;
 16     struct BiNode *left,*right;
 17 }BiNode, *BiTree;
 18 
 19 Status LevelTraverseBiTree(BiTree T)//二叉排序树层序遍历
 20 {
 21     std::queue<BiTree> qbi;
 22     BiTree p;
 23     if(T)//逻辑要判断准确
 24     {
 25         qbi.push(T);
 26         while(!qbi.empty())
 27         {
 28             p = qbi.front();
 29             printf("%d ",p->data);
 30             qbi.pop();
 31             if(p->left)
 32             {
 33                 qbi.push(p->left);
 34             }
 35             if(p->right)
 36             {
 37                 qbi.push(p->right);
 38             }
 39         }
 40         printf("\n");
 41     }
 42     return OK;
 43 }
 44 
 45 bool EQ(ElemType t1,ElemType t2)
 46 {
 47     return t1 == t2;
 48 }
 49 
 50 bool LT(ElemType t1,ElemType t2)
 51 {
 52     return t1 < t2;
 53 }
 54 
 55 Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p)//查找二叉排序树
 56 {
 57     if(!T)
 58     {
 59         p = f;
 60         return ERROR;//查找失败
 61     }
 62     else if(EQ(T->data,key))
 63     {
 64         p = T;
 65         return OK;
 66     }
 67     else if(LT(T->data,key))
 68     {
 69         return SearchBST(T->right,key,T,p);
 70     }
 71     else
 72     {
 73         return SearchBST(T->left,key,T,p);
 74     }
 75 }
 76 
 77 Status InsertBST(BiTree &T,KeyType key)//这里一定要加&号,在二叉排序树中插入节点
 78 {
 79     BiTree p;
 80     if(!SearchBST(T,key,NULL,p))
 81     {
 82         BiTree s = (BiNode *)malloc(sizeof(BiNode));
 83         s->data = key;
 84         s->left = NULL;
 85         s->right = NULL;
 86         if(!p)
 87         {
 88             T = s;
 89         }
 90         else if(LT(p->data,key))
 91         {
 92             p->right = s;
 93         }
 94         else
 95         {
 96             p->left = s;
 97         }
 98         return OK;
 99     }
100     return OK;
101 }
102 
103 Status Delete(BiTree p)//执行具体删除节点操作
104 {
105     BiTree q;
106     if(!p->right)
107     {
108         q = p;
109         p = p->left;
110         free(q);
111     }
112     else if(!p->left)
113     {
114         q = p;
115         p = p->right;
116         free(q);
117     }
118     else
119     {
120         BiTree s = p->left;//首先s指向p的做孩子,寻找p左孩子中最右边的位置
121         q = p;
122         while(s->right)
123         {
124             q = s;
125             s = s->right;
126         }
127         p->data = s->data;
128         if(q != p)
129         {
130             q->right = s->left;
131         }
132         else
133         {
134             p->left = s->left;
135         }
136         free(s);
137     }
138     return OK;
139 }
140 
141 Status DeletBST(BiTree &T,KeyType key)//删除二叉排序树中值为key的节点
142 {
143     if(!T)
144     {
145         return ERROR;
146     }
147     if(EQ(T->data,key))
148     {
149         return Delete(T);
150     }
151     else if(LT(T->data,key))
152     {
153         return DeletBST(T->right,key);
154     }
155     else
156     {
157         return DeletBST(T->left,key);
158     }
159 }
160 #endif

main.cpp

 1 #include "searchBST.h"
 2 
 3 int main()
 4 {
 5     BiTree T = NULL;
 6     BiTree p;
 7     int a[5] = {45,24,53,12,90};
 8     for(int i = 0;i < 5;i++)
 9     {
10         InsertBST(T,a[i]);
11     }
12     LevelTraverseBiTree(T);
13 
14     InsertBST(T,37);
15     LevelTraverseBiTree(T);
16 
17     printf("before delete 24:\n");
18     if(SearchBST(T,24,NULL,p))
19     {
20         printf("24 has been found!\n");
21     }
22 
23     printf("after delete 24:\n");
24     DeletBST(T,24);
25     if(!SearchBST(T,24,NULL,p))
26     {
27         printf("24 has not been found!\n");
28     }
29 
30     LevelTraverseBiTree(T);
31     
32     
33 
34     system("pause");
35     return 0;
36 }

 

posted @ 2012-12-06 22:48  maowang  阅读(320)  评论(0编辑  收藏  举报