二分搜索树的基础结构

来源:互联网 发布:电钢琴怎么选 知乎 编辑:程序博客网 时间:2024/06/05 02:44

上一节我们讲到了二分搜索法,这一节我们来讲讲二分搜索树。

二分搜索树通常用于实现查找表这种结构,也可以称作“字典”,通过一个键(key),我们就能够查到其值(value),如果key都是整数,而且范围较小,我们则可以直接使用数组表示,但是如果key不能用整数表示或者key分散的较为疏散,则会浪费大量的空间,因此,我们需要一个查找表,最基础的方式也就是使用一个二叉搜索树。


二分搜索树具有以下的优点:

1.性能高效。

2.不仅可以查找数据,还可以高效地插入,删除数据以及动态维护。

3.可以方便的求出min,max,rank之类的关系。

二分搜索树的性质如下:



因为每一个节点都符合上述要求,因此对于根节点,左子树包含的值全部要小于右子树包含的值,我们可以想象一下上一节讲的二叉搜索法,以mid为中心界限,是不是mid把一段数据给分成了两半,mid左边的数据都比mid小,mid右边的数据都比mid大.然后在左边这一小段或者右边这一小段我们又可以用同样的方法去分,直到分到不能再分为止,就正如上面的二叉搜索树一样,父节点把数据分成了左右两部分,左边的小于父节点,右边的大于父节点,既然二叉查找法可以用递归,那么二叉搜索树也可以使用递归去搜索了。然而,二叉搜索树相比于堆排序来说,并不一定需要是一个完全二叉树。只要保证父节点与左右子节点的关系即可。

以下是二叉树的实现代码:

#include <iostream>using namespace std;template <typename key,typename value>class BST{//构建二叉搜索树类private:    struct node{//构建节点结构        key key;        value value;        node*left;//left指向左节点        node*right;//right指向右节点        node(key key ,value value){//初始化节点            this->key=key;            this->value=value;            this->left=NULL;            this->right=NULL;        }    };    node*root;//root指向二叉树的根节点    int count;//计数二叉树中的节点数public:    BST(){        root=NULL;        count=0;    }    ~BST(){//暂时为空    }    int size(){//返回节点数量        return count;    }    bool isempty(){//返回二叉树是否为空        return count==0;    }};



原创粉丝点击