您的位置:首页 > 编程语言 > C语言/C++

二叉搜索树(Binary Search Tree)的递归和非递归代码实现(C++)

2016-06-28 13:36 483 查看


二叉搜索树(Binary Search Tree)的递归和非递归代码实现(C++)


二叉搜索树简单介绍

二叉搜索树(Binary Search Tree)是满足:

左子树的根节点比树的根节点小
右子树的根节点比树的根节点大

的二叉树。

由于这种数据结构具有很高的查询效率,故多用于需要索引的场合。

二叉搜索树的搜索过程可以理解成类二分查找,因为根节点就等效于一串数据的分界点,左子树的所有节点都小于根节点,右子树的所有节点都大于根节点,然后每次比较都能确定元素属于哪一部分,故查询效率为O(nlogn)。


查找

根据二叉搜索数的性质有:

大于节点key的元素在右子树
小于节点key的元素在左子树

在二叉搜索树中查找指定元素 k(node表示当前搜索节点):

递归思路:

若 k > node->key,搜索 node->rNode

若 k < node->key,搜索 node->lNode

若 k = node->key,返回 node->val
非递归思路

设置一个用来遍历节点的指针p

若 k > p->key,p = p->rNode

若 k < p->key,p = p->lNode

若 k = p->key,返回 p->val


插入

首先需要寻找到插入位置,在寻找位置的过程中如果发现有相同key则更新该key对应的value,否则插入新的节点

- 递归思路:

递归出口:node = NULL,创建新节点并用 key 和 val 初始化

若 k > node->key,node->lNode = put(node->lNode, key)

若 k < node->key,node->rNode = put(node->rNode, key)

若 k = node->key,node->val = val

当前节点个数 = 左子树节点个数 + 右子树节点个数 + 1

- 非递归思路:

设置一个堆栈和遍历指针 p,p 的父节点指针 pa

将经过的节点都记录到堆栈中,如果找到重复节点则更新值并清空堆栈。

否则新建节点并用 key 和 val 初始化,并将 pa 指向 p,同时栈中所有节点的节点个数 N 增加1


删除

递归思路:

和插入类似,只是在key = node->key的时候需要分情况:

若 node->rNode 不为空,则找到 node->rNode 子树的最小节点min并将node->key = min->key,node->val = min->val,然后删除该最小节点

若 node->rNode 为空,node->lNode 不为空,则直接 node = node ->lNode

若 node->rNode 为空,node->lNode 为空,则直接 node = NULL
非递归思路:

和递归类似,只是需要遍历堆栈去更新遍历路径上的节点数 N


代码实现

递归版本
//BSTR.h
#ifndef BSTR_H
#define BSTR_H

#include <iostream>
template<typename K, typename V>
struct Node
{
K key;
V val;
int N;
Node<K,V>* lNode;
Node<K,V>* rNode;
Node()
{
this->lNode = NULL;
this->rNode = NULL;
}
Node(K key, V val)
{
this->key = key;
this->val = val;
this->lNode = NULL;
this->rNode = NULL;
this->N = 1;
}
};

template<typename K, typename V>
class BST
{
public:
BST();
~BST();
V get(const K& key) const;
void put(const K& key, const V& val);
void del(const K& key);
bool contain(const K& key) const;
int size() const;
void clean();
void print() const;

K floor(const K& key) const;
K celling(const K& key) const;
int rank(const K& key) const;
K select(int rk) const;
K minKey() const;
K maxKey() const;
void delMin();
void delMax();
protected:
Node<K,V>* root;

V get(Node<K,V>* node, const K& key) const;
void clean(Node<K,V>* node);
Node<K,V>* put(Node<K,V>* node, const K& key, const V& val);
Node<K,V>* del(Node<K,V>* node, const K& key);
bool contain(Node<K,V>* node, const K& key) const;
int size(Node<K,V>* node) const;
void print(Node<K,V>* node) const;
K floor(Node<K,V>* node, const K& key) const;
K celling(Node<K,V>* node, const K& key) const;
int rank(Node<K,V>* node, const K& key) const;
K select(Node<K,V>* node, int rk) const;
K minKey(Node<K,V>* node) const;
K maxKey(Node<K,V>* node) const;
Node<K,V>* delMin(Node<K,V>* node);
Node<K,V>* delMax(Node<K,V>* node);

};

//构造 析构函数
template<typename K, typename V>
BST<K,V>::BST()
{
this->root = NULL;
}
template<typename K, typename V>
BST<K,V>::~BST()
{
if (this->root != NULL)
clean(this->root);
}

/********************************************************************
函数名称:   clean
函数说明:   清空表
返回值:    无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::clean()
{
clean(this->root);
this->root = NULL;
}

template<typename K, typename V>
void BST<K,V>::clean(Node<K,V>* node)
{
if (node == NULL)
return ;
clean(node->lNode);
clean(node->rNode);
delete node;
}

/********************************************************************
函数名称:   size
函数说明:   无
返回值:     表的大小
*********************************************************************/
template<typename K, typename V>
int BST<K,V>::size() const
{
return size(this->root);
}

template<typename K, typename V>
int BST<K,V>::size(Node<K,V>* node) const
{
if (node != NULL)
return node->N;
else
return 0;
}
/********************************************************************
函数名称:   put
函数说明:   放入键值对<key,value> 若存在则将原有的value替换成新的value
返回值:     无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::put(const K& key, const V& val)
{
this->root = put(this->root, key, val);
}

template<typename K, typename V>
Node<K,V>* BST<K,V>::put(Node<K,V>* node, const K& key, const V& val)
{
if (node == NULL)
return new Node<K,V>(key ,val);
if (key > node->key)
node->rNode = put(node->rNode, key, val);
else if (key < node->key)
node->lNode = put(node->lNode, key, val);
else
node->val = val;
node->N = size(node->lNode) + size(node->rNode) + 1;
return node;
}

/********************************************************************
函数名称:   get
函数说明:   获取指定key的value
返回值:     value
*********************************************************************/
template<typename K, typename V>
V BST<K,V>::get(const K& key) const
{
return get(this->root, key);
}

template<typename K, typename V>
V BST<K,V>::get(Node<K,V>* node, const K& key) const
{
if (node == NULL)
return NULL;
if (key > node->key)
return get(node->rNode, key);
else if (key < node->key)
return get(node->lNode, key);
else
return node->val;
}
/********************************************************************
函数名称:   del
函数说明:   删除某个key
返回值:     无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::del(const K& key)
{
this->root = del(this->root, key);
}

template<typename K, typename V>
Node<K,V>* BST<K,V>::del(Node<K,V>* node, const K& key)
{
if (node == NULL)
return NULL;
if (key > node->key)
node->rNode = del(node->rNode, key);
else if (key < node->key)
node->lNode = del(node->lNode, key);
else
{
Node<K,V>* newNode;
if (node->lNode == NULL && node->rNode == NULL)
return NULL;
else if (node->lNode != NULL && node->rNode == NULL)
{
newNode = node->lNode;
delete node;
node = newNode;
}
else if (node->lNode == NULL && node->rNode != NULL)
{
newNode = node->rNode;
delete node;
node = newNode;
}
else
{
node->key = minKey(node->rNode);
node->val = get(node->key);
node->rNode = delMin(node->rNode);
}
}
node->N = size(node->lNode) + size(node->rNode) + 1;
return node;
}
/********************************************************************
函数名称:   print
函数说明:   打印表中内容
返回值:     无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::print() const
{
print(this->root);
}
template<typename K, typename V>
void BST<K,V>::print(Node<K,V>* node) const
{
if (node == NULL)
return;
print(node->lNode);
std::cout << node->key << ":" << node->val << " : " << node->N << std::endl;
print(node->rNode);
}

/********************************************************************
函数名称:   contain
函数说明:   是否包含key
返回值:     包含返回true 不包含返回false
*********************************************************************/
template<typename K, typename V>
bool BST<K,V>::contain(const K& key) const
{
return contain(this->root, key);
}
template<typename K, typename V>
bool BST<K,V>::contain(Node<K,V>* node, const K& key) const
{
if (node == NULL)
return false;
if (key > node->key)
contain(node->rNode, key);
else if (key < node->key)
contain(node->lNode, key);
else
return true;
}

/********************************************************************
函数名称:  floor
函数参数: key
函数说明:  寻找表中小于等于key的最大key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::floor(const K& key) const
{
return floor(this->root, key);
}
template<typename K, typename V>
K BST<K,V>::floor(Node<K,V>* node, const K& key) const
{
static K mKey;
if (node == NULL)
return mKey;
if (key > node->key)
{
mKey = node->key;
floor(node->rNode, key);
}
else if (key < node->key)
floor(node->lNode, key);
else
return node->key;
}

/********************************************************************
函数名称:  celling
函数参数: key
函数说明:  寻找表中大于等于key的最小key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::celling(const K& key) const
{
return celling(this->root, key);
}
template<typename K, typename V>
K BST<K,V>::celling(Node<K,V>* node, const K& key) const
{
static K mKey;
if (node == NULL)
return mKey;
if (key > node->key)
celling(node->rNode, key);
else if (key < node->key)
{
mKey = node->key;
celling(node->lNode, key);
}
else
return node->key;
}

/********************************************************************
函数名称:  rank
函数参数: key的值
函数说明:  在表中找出小于等于key值的元素个数
返回值:    key的个数
*********************************************************************/
template<typename K, typename V>
int BST<K,V>::rank(const K& key) const
{
return rank(this->root, key);
}
template<typename K, typename V>
int BST<K,V>::rank(Node<K,V>* node, const K& key) const
{
if (node == NULL)
return 0;
if (key >= node->key)
return size(node->lNode) + 1 + rank(node->rNode, key);
else
return rank(node->lNode, key);
}

/********************************************************************
函数名称:  select
函数参数: 元素个数
函数说明:  在表中按从小到大的顺序找出第 k 个key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::select(int rk) const
{
return select(this->root, rk);
}
template<typename K, typename V>
K BST<K,V>::select(Node<K,V>* node, int rk) const
{
int N;
if (rk > this->root->N)
rk = this->root->N;
if (node->lNode != NULL)
N = node->lNode->N;
else
N = 0;
if (rk <= N)
return select(node->lNode, rk);
else if (rk == (N + 1))
return node->key;
else
return select(node->rNode, rk - N - 1);
}

/********************************************************************
函数名称:  minKey
函数参数: 无
函数说明:  返回表中最小的key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::minKey() const
{
return minKey(this->root);
}
template<typename K, typename V>
K BST<K,V>::minKey(Node<K,V>* node) const
{
if (node->lNode == NULL)
return node->key;
minKey(node->lNode);
}

/********************************************************************
函数名称:  maxKey
函数参数: 无
函数说明:  返回表中最大的key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::maxKey() const
{
return maxKey(this->root);
}
template<typename K, typename V>
K BST<K,V>::maxKey(Node<K,V>* node) const
{
if (node->rNode == NULL)
return node->key;
maxKey(node->rNode);
}

/********************************************************************
函数名称:  delMin
函数参数: 无
函数说明:  删除表中最小key
返回值:    无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::delMin()
{
this->root = delMin(this->root);
}
template<typename K, typename V>
Node<K,V>* BST<K,V>::delMin(Node<K,V>* node)
{
if (node->lNode == NULL)
{
Node<K,V>* rNode = node->rNode;
delete node;
return rNode;
}
else
node->lNode = delMin(node->lNode);
node->N = size(node->lNode) + size(node->rNode) + 1;
return node;
}

/********************************************************************
函数名称:  delMax
函数参数: 无
函数说明:  删除表中最大key
返回值:    无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::delMax()
{
this->root = delMax(this->root);
}
template<typename K, typename V>
Node<K,V>* BST<K,V>::delMax(Node<K,V>* node)
{
if (node->rNode == NULL)
{
Node<K,V>* lNode = node->lNode;
delete node;
return lNode;
}
else
node->rNode = delMax(node->rNode);
node->N = size(node->lNode) + size(node->rNode) + 1;
return node;
}

#endif

#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
[/code]

非递归版本
#ifndef BST_H
#define BST_H

#include <iostream>
#include <stack>

template<typename K, typename V>
struct Node
{
K key;
V val;
int N;
Node<K,V>* lNode;
Node<K,V>* rNode;
Node()
{
this->lNode = NULL;
this->rNode = NULL;
this->N = 1;
}
Node(K key, V val)
{
this->key = key;
this->val = val;
this->lNode = NULL;
this->rNode = NULL;
this->N = 1;
}
};
template<typename K, typename V>
class BST : public ST<K,V>
{
public:
BST();
~BST();
V get(const K& key) const;
void put(const K& key, const V& val);
void del(const K& key);
bool contain(const K& key) const;
int size() const;
void clean();
void print() const;

K floor(const K& key) const;
K celling(const K& key) const;
int rank(const K& key) const;
K select(int rk) const;
K minKey() const;
K maxKey() const;
void delMin();
void delMax();
protected:
Node<K,V>* root;

std::stack<Node<K,V>*> *s; //辅助堆栈
int size(Node<K,V>* node) const;
void print(Node<K,V>* node) const;
void insNode(Node<K,V>* node, Node<K,V>* theNode);
Node<K,V>* findPos(Node<K,V>* node, const K& key) const;
};

//构造 析构函数
template<typename K, typename V>
BST<K,V>::BST()
{
this->root = NULL;
this->s = new std::stack<Node<K,V>*>;
}
template<typename K, typename V>
BST<K,V>::~BST()
{
clean();
}

/********************************************************************
函数名称:   get
函数说明:   获取指定key的value
返回值:     value
*********************************************************************/
template<typename K, typename V>
V BST<K,V>::get(const K& key) const
{
if (this->root == NULL)
return NULL;
Node<K,V>* tNode = findPos(this->root, key);
if (tNode->key != key)
return NULL;
else
return tNode->val;
}
/********************************************************************
函数名称:   put
函数说明:   放入键值对<key,value> 若存在则将原有的value替换成新的value
返回值:     无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::put(const K& key, const V& val)
{
if (this->root == NULL)
this->root = new Node<K,V>(key, val);
else
{
Node<K,V>* tNode = findPos(this->root, key);
if (tNode->key != key)
{
insNode(tNode, new Node<K,V>(key, val));
while (!this->s->empty())
{
this->s->top()->N++;
this->s->pop();
}
}
else
{
tNode->val = val;
}
}
}

/********************************************************************
函数名称:   del
函数说明:   删除某个key
返回值:     无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::del(const K& key)
{
Node<K,V> *parentNode = NULL, *currentNode = this->root;
//清空堆栈
while (!this->s->empty())
this->s->pop();

//寻找被删除的节点以及该节点的父节点
while (currentNode != NULL)
{
if (key == currentNode->key)
break;
this->s->push(parentNode = currentNode);
if (key > currentNode->key)
currentNode = currentNode->rNode;
else
currentNode = currentNode->lNode;
}

//没有寻找到需要删除的节点
if (currentNode == NULL)
return ;
if (currentNode == this->root) //删除的节点是根节点
{
if (currentNode->lNode == NULL)
this->root = currentNode->rNode;
else if (currentNode->rNode == NULL)
this->root = currentNode->lNode;
else
{
//把右子树插入左子树中
insNode(findPos(this->root = currentNode->lNode, currentNode->rNode->key), currentNode->rNode);
while (!this->s->empty())
{
this->s->top()->N += size(currentNode->rNode);
this->s->pop();
}
}
}
else //删除的节点是非根节点
{
//父指针置 NULL
if (currentNode == parentNode->lNode)
parentNode->lNode = NULL;
else
parentNode->rNode = NULL;

while (!this->s->empty())
{
this->s->top()->N -= size(currentNode);
this->s->pop();
}

if (currentNode->lNode != NULL)
{
insNode(findPos(this->root, currentNode->lNode->key), currentNode->lNode);
while (!this->s->empty())
{
this->s->top()->N += size(currentNode->lNode);
this->s->pop();
}
}
if (currentNode->rNode != NULL)
{
insNode(findPos(this->root, currentNode->rNode->key), currentNode->rNode);
while (!this->s->empty())
{
this->s->top()->N += size(currentNode->rNode);
this->s->pop();
}
}
}
delete currentNode;
}

/********************************************************************
函数名称:   size
函数说明:   无
返回值:     表的大小
*********************************************************************/
template<typename K, typename V>
int BST<K,V>::size() const
{
return size(this->root);
}

template<typename K, typename V>
int BST<K,V>::size(Node<K,V>* node) const
{
if (node == NULL)
return NULL;
return node->N;
}
/********************************************************************
函数名称:   clean
函数说明:   清空表 采用层序遍历
返回值:    无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::clean()
{
if (this->root == NULL)
return ;
int currentPos = 0, i = 0;
int TSize = size();
Node<K,V>** nodeList = new Node<K,V>*[TSize];
nodeList[i++] = this->root;
while (currentPos < TSize)
{
if (nodeList[currentPos]->lNode != NULL)
nodeList[i++] = nodeList[currentPos]->lNode;
if (nodeList[currentPos]->rNode != NULL)
nodeList[i++] = nodeList[currentPos]->rNode;
delete nodeList[currentPos];
currentPos++;
}
delete[] nodeList;
this->root = NULL;
}
/********************************************************************
函数名称:   print
函数说明:   打印表中内容
返回值:     无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::print() const
{
//print(this->root);
std::stack<Node<K,V>*> x;
Node<K,V>* currentNode = this->root;
//std::stack<Node<K,V>*> f;
//中序遍历非递归
while (1)
{
while (currentNode != NULL)
{
x.push(currentNode);
currentNode = currentNode->lNode;
}
while (!x.empty() && x.top()->rNode == NULL)
{
std::cout << x.top()->key << " : " << x.top()->val << std::endl;
x.pop();
}
if (x.empty())
break;
std::cout << x.top()->key << " : " << x.top()->val << std::endl;
currentNode = x.top()->rNode;
x.pop();
}

//前序遍历非递归
//while (1)
//{
//   while (currentNode != NULL)
//   {
//       std::cout << currentNode->key << " : " << currentNode->val << std::endl;
//       if (currentNode->rNode != NULL)
//           x.push(currentNode->rNode);
//       currentNode = currentNode->lNode;
//   }
//   if (x.empty())
//       break;
//   currentNode = x.top();
//   x.pop();
//}

//后序遍历非递归
//while (1)
//{
//  while (currentNode != NULL)
//  {
//      x.push(currentNode);
//      currentNode = currentNode->lNode;
//  }
//  while (!x.empty() && x.top()->rNode == NULL)
//  {
//      std::cout << x.top()->key << " : " << x.top()->val << std::endl;
//      x.pop();
//  }
//  while (!x.empty() && !f.empty() && x.top() == f.top())
//  {
//      std::cout << x.top()->key << " : " << x.top()->val << std::endl;
//      x.pop();
//      f.pop();
//  }

//  if (x.empty())
//      break;

//  if (x.top()->rNode != NULL)
//      f.push(x.top());

//  currentNode = x.top()->rNode;
//}

}
template<typename K, typename V>
void BST<K,V>::print(Node<K,V>* node) const
{
if (node == NULL)
return;
print(node->lNode);
std::cout << node->key << ":" << node->val << "   " << node->N << std::endl;
print(node->rNode);

}

/********************************************************************
函数名称:   contain
函数说明:   是否包含key
返回值:     包含返回true 不包含返回false
*********************************************************************/
template<typename K, typename V>
bool BST<K,V>::contain(const K& key) const
{
return findPos(this->root, key)->key == key;
}

/********************************************************************
函数名称:   findPos
函数说明:   寻找 键值为key的节点 或 该节点插入树时父节点的位置
返回值:     指向该节点的指针
*********************************************************************/
template<typename K, typename V>
Node<K,V>* BST<K,V>::findPos(Node<K,V>* node, const K& key) const
{

//递归版本
//if (key > node->key)
//{
//  if (node->rNode == NULL)
//      return node;
//  else
//      return findPos(node->rNode, key);
//}
//else if (key < node->key)
//{
//  if (node->lNode == NULL)
//      return node;
//  else
//      return findPos(node->lNode, key);
//}
//else
//  return node;
//非递归
if (this->root == NULL)
return NULL;
while (!this->s->empty())
this->s->pop();

while(1)
{
this->s->push(node);

if (key > node->key)
{
if (node->rNode == NULL)
return node;
else
node = node->rNode;
}
else if (key < node->key)
{
if (node->lNode == NULL)
return node;
else
node = node->lNode;
}
else
return node;
}

}

/********************************************************************
函数名称:  insNode
函数参数: 插入节点和待插入节点
函数说明:  将一棵树插入另一棵树上
返回值:    无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::insNode(Node<K,V>* node, Node<K,V>* theNode)
{
if (theNode->key > node->key)
node->rNode = theNode;
else
node->lNode = theNode;
}

/********************************************************************
函数名称:  floor
函数参数: key
函数说明:  寻找表中小于等于key的最大key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::floor(const K& key) const
{
if (this->root == NULL)
return NULL;
Node<K,V>* currentNode = this->root;
K mKey;
while (currentNode != NULL)
{
if (key > currentNode->key)
{
mKey = currentNode->key;
currentNode = currentNode->rNode;
}
else if (key < currentNode->key)
currentNode = currentNode->lNode;
else
return currentNode->key;
}
return mKey;
}

/********************************************************************
函数名称:  celling
函数参数: key
函数说明:  寻找表中大于等于key的最小key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::celling(const K& key) const
{
if (this->root == NULL)
return NULL;
Node<K,V>* currentNode = this->root;
K mKey;
while (currentNode != NULL)
{
if (key > currentNode->key)
currentNode = currentNode->rNode;
else if (key < currentNode->key)
{
mKey = currentNode->key;
currentNode = currentNode->lNode;
}
else
return currentNode->key;
}
return mKey;
}

/********************************************************************
函数名称:  minKey
函数参数: 无
函数说明:  返回表中最小的key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::minKey() const
{
if (this->root == NULL)
return NULL;
Node<K,V>* currentNode = this->root;
while (currentNode->lNode != NULL)
currentNode = currentNode->lNode;
return currentNode->key;
}

/********************************************************************
函数名称:  maxKey
函数参数: 无
函数说明:  返回表中最大的key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::maxKey() const
{
if (this->root == NULL)
return NULL;
Node<K,V>* currentNode = this->root;
while (currentNode->rNode != NULL)
currentNode = currentNode->rNode;
return currentNode->key;
}

/********************************************************************
函数名称:  delMin
函数参数: 无
函数说明:  删除表中最小key
返回值:    无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::delMin()
{
if (this->root == NULL)
return ;

while (!this->s->empty())
this->s->pop();

Node<K,V>* currentNode = this->root;
while (currentNode->lNode != NULL)
{
this->s->push(currentNode);
currentNode = currentNode->lNode;
}

if (currentNode->rNode != NULL)
this->s->top()->lNode = currentNode->rNode;
else
this->s->top()->lNode = NULL;

delete currentNode;

while (!this->s->empty())
{
this->s->top()->N--;
this->s->pop();
}
}

/********************************************************************
函数名称:  delMax
函数参数: 无
函数说明:  删除表中最大key
返回值:    无
*********************************************************************/
template<typename K, typename V>
void BST<K,V>::delMax()
{
if (this->root == NULL)
return ;

while (!this->s->empty())
this->s->pop();

Node<K,V>* currentNode = this->root;
while (currentNode->rNode != NULL)
{
this->s->push(currentNode);
currentNode = currentNode->rNode;
}

if (currentNode->lNode != NULL)
this->s->top()->rNode = currentNode->lNode;
else
this->s->top()->rNode = NULL;

delete currentNode;

while (!this->s->empty())
{
this->s->top()->N--;
this->s->pop();
}
}

/********************************************************************
函数名称:  rank
函数参数: key的值
函数说明:  在表中找出小于等于key值的元素个数
返回值:    key的个数
*********************************************************************/
template<typename K, typename V>
int BST<K,V>::rank(const K& key) const
{
if (this->root == NULL)
return NULL;
int num = 0;
Node<K,V>* currentNode = this->root;
while (currentNode != NULL)
{
if (key >= currentNode->key)
{
num += (size(currentNode->lNode) + 1);
currentNode = currentNode->rNode;
}
else
currentNode = currentNode->lNode;
}
return num;
}

/********************************************************************
函数名称:  select
函数参数: 元素个数
函数说明:  在表中按从小到大的顺序找出第 k 个key
返回值:    key
*********************************************************************/
template<typename K, typename V>
K BST<K,V>::select(int rk) const
{
if (this->root == NULL)
return NULL;
Node<K,V>* currentNode = this->root;
int num = rk;
if (num > size())
num = size();
while(currentNode != NULL)
{
if (num == size(currentNode->lNode) + 1)
return currentNode->key;
else if (num > size(currentNode->lNode))
{
num -= (size(currentNode->lNode) + 1);
currentNode = currentNode->rNode;
}
else
currentNode = currentNode->lNode;
}
return NULL;
}
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: