二叉搜尋樹(Binary Search Tree)的遞迴和非遞迴程式碼實現(C++)
阿新 • • 發佈:2019-01-31
二叉搜尋樹簡單介紹
二叉搜尋樹(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
非遞迴版本
#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