折半查找树也叫做二叉排序树。所谓的折半查找树就是左子树的所有节点都比跟节点小,右子树的所有节点都比根节点大(不考虑有重复元素的情况)。
上图就是一颗典型的排序二叉树。它是平衡排序二叉树(AVL)的基础。
可以很容易的看出来,上图的dfs序就是从小到大排好序的。
以下内容来自数据结构与STL。
BinSearchTree类的字段如下:
#ifndef _BIN_SEARCH_TREE_
#define _BIN_SEARCH_TREE_
template<class T>
class BinSearchTree {
struct tree_node {
T item;
tree_node *parent, *left, *right;
bool isHeader;
};
tree_node *header;
unsigned node_count;
};
#endif
节点tree_node中包含了一个数据字段(item),三个指针字段,一个头结点字段(采用头结点形式实现)
BinSearchTree中包含一个指向头结点的指针header,跟一个记录节点个数的node_count字段。
构造器:
BinSearchTree(){
header = new tree_node;
header->parent = NULL;//parent指向根节点,在一颗空树中指定根节点是不合理的
header->left = header;
header->right = header;
header->isHeader = true;
node_count = 0;
}
在BinSearchTree中添加一个迭代器类Iterator。
#ifndef _BIN_SEARCH_TREE_
#define _BIN_SEARCH_TREE_
template<class T>
class BinSearchTree {
struct tree_node {
T item;
tree_node *parent, *left, *right;
bool isHeader;
};
typedef tree_node *Link;
tree_node *header;
unsigned node_count;
protected:
class Iterator {
protected:
Link link;
public:
Iterator() {}
Iterator(Link new_link) :link(new_link) {}
};
public:
BinSearchTree(){
header = new tree_node;
header->parent = NULL;//parent指向根节点,在一颗空树中指定根节点是不合理的
header->left = header;
header->right = header;
header->isHeader = true;
node_count = 0;
}
};
#endif
向BinSearchTree类中添加size方法:
unsigned size() {
return node_count;
}
下面分别添加find,insert,erase方法。
Iterator find(const T& item) {
Link parent = header;
Link child = header->parent;
while (child != NULL) {