二叉搜索树(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

非递归版本

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值