BST

  1 #include <IOSTREAM>
  2 #include <QUEUE>
  3 using namespace std;
  4 
  5 //结点的结构体
  6 //内涵三个参数,关键字Key,左孩子指针,右孩子指针
  7 typedef struct _NODE_
  8 {
  9     int Key;
 10     _NODE_* pLeft;
 11     _NODE_* pRight;
 12 }Node,*pNode;
 13 
 14 //中序遍历
 15 void InOrderTraves(pNode T);
 16 
 17 
 18 //层状遍历
 19 void LevelTraves(pNode T);
 20 
 21 //搜索结点
 22 bool SearchNode(pNode T, int Key, pNode& f, pNode& p);
 23 
 24 //插入结点
 25 bool InsertNode(pNode& T,int Key);
 26 
 27 //删除结点
 28 void DeleteNode(pNode& T,int Key);
 29 
 30 //销毁树
 31 void DestroyTree(pNode& T);
 32 
 33 //测试函数
 34 int main()
 35 {
 36     pNode BST = NULL;
 37     int Key = 0;
 38     cout<<"Create a BST: ";
 39     cin>>Key;
 40     while (Key != -1)
 41     {
 42         InsertNode(BST,Key);
 43         cin>>Key;
 44     }
 45 
 46     InOrderTraves(BST);
 47     cout<<endl;
 48     LevelTraves(BST);
 49     cout<<endl;
 50 
 51     DestroyTree(BST);
 52     return 0;
 53 }
 54 
 55 void InOrderTraves(pNode T)
 56 {
 57     if (T != NULL)
 58     {
 59         InOrderTraves(T->pLeft);
 60         cout<<T->Key<<" ";
 61         InOrderTraves(T->pRight);
 62     }
 63 }
 64 
 65 //使用STL 的 queue队列
 66 void LevelTraves(pNode T)
 67 {
 68     if (T == NULL)
 69     {
 70         return;
 71     }
 72 
 73     pNode p = T;
 74 
 75     queue<pNode> Que;
 76     Que.push(p);
 77 
 78     while (!Que.empty())
 79     {
 80         p = Que.front();
 81         Que.pop();
 82         cout<<p->Key<<" ";
 83 
 84         if (p->pLeft != NULL)
 85         {
 86             Que.push(p->pLeft);
 87         }
 88         if (p->pRight != NULL)
 89         {
 90             Que.push(p->pRight);
 91         }
 92     }
 93 
 94 }
 95 
 96 
 97 // 查找函数
 98 // 参数:
 99 // 树根T, 待查找的关键字Key, 
100 // 指针f(用于存放找到结点的父节点)
101 // 指针p(用于存放找到结点)
102 bool SearchNode(pNode T, int Key, pNode& f, pNode& p)
103 {
104     p = T;
105     if (p == NULL)
106     {
107         return false;
108     }
109     while (p!=NULL)
110     {
111         if (p->Key == Key)
112         {
113             return true;
114         }
115         if (p->Key > Key)
116         {
117             f = p;
118             p = p->pLeft;
119         }
120         if (p->Key < Key)
121         {
122             f = p;
123             p = p->pRight;
124         }
125     }
126 
127     return false;
128 }
129 
130 
131 bool InsertNode(pNode& T,int Key)
132 {
133 
134     //如果根结点不存在,动态申请内存空间
135     if (T == NULL)
136     {
137         T = (pNode)malloc(sizeof(Node));
138 
139         T->Key = Key;
140         T->pLeft = T->pRight = NULL;
141 
142         return true;
143     }
144     //在保持BST的性质的情况下进行插入
145     else
146     {
147         if (T->Key == Key)
148         {
149             cout<<"Error"<<endl;
150             return false;
151         }
152         if (T->Key > Key)
153         {
154             InsertNode(T->pLeft,Key);
155         }
156         else
157         {
158             InsertNode(T->pRight,Key);
159         }
160     }
161 
162     return false;
163 }
164 
165 
166 //有四种情况
167 
168 /*
169 *    情况一: 待删结点为叶子结点(无左孩子也无又孩子)
170 *    直接将其父节点的左(或者右)孩子的值赋为空
171 *    
172 *    情况二: 待删结点只有左子树
173 *    将其父节点的左子树赋为待删结点的左子树
174 *
175 *    情况三: 待删结点只有右子树
176 *    将其父节点的右子树赋为待删结点的右子树
177 *
178 *    情况四: 待删结点既有右子树,右有左子树
179 *    找到待删结点的前驱结点,替换待删结点。
180 */
181 void DeleteNode(pNode& T,int Key)
182 {
183 
184     pNode p = NULL;
185     pNode q = NULL;
186     pNode s = NULL;
187     pNode f = NULL;
188 
189     if(SearchNode(T,Key,f,p))
190     {
191         if (p->pLeft && p->pRight)
192         {
193             q = p;
194             //找到p的直接前驱
195             s = s->pLeft;
196             while (s->pRight != NULL)
197             {
198                 q = s;
199                 s = s->pRight;
200             }
201 
202             //将值和直接前驱调换
203             p->Key = s->Key;
204 
205             //这种情况是一般情况,q 和 p不相等
206             if (q != p)
207             {
208                 q->pRight = s->pLeft;
209             }
210             //特殊情况
211             else
212             {
213                 q->pLeft =s->pLeft;
214             }
215         }
216         else if(p->pLeft == NULL && p->pRight == NULL)
217         {
218             if (f->pRight == p)
219             {
220                 f->pRight = NULL;
221             }
222             else
223             {
224                 f->pLeft = NULL;
225             }
226         }
227         else if (p->pLeft != NULL && p->pRight == NULL)
228         {
229             f->pLeft = p->pLeft;
230         }
231         else
232         {
233             f->pRight = p->pRight;
234         }
235     }
236 
237 }
238 
239 void DestroyTree(pNode& T)
240 {
241     if (T != NULL)
242     {
243         if (T->pLeft != NULL)
244         {
245             DestroyTree(T->pLeft);
246         }
247         if (T->pRight != NULL)
248         {
249             DestroyTree(T->pRight);
250         }
251 
252         free(T);
253     }
254 }
原文地址:https://www.cnblogs.com/Lee-geeker/p/3505845.html