树是一种基本的数据结构.二叉查找树以其高效的搜索效率而被在大数据搜索中广泛应用.本系列文章旨在建立二叉查找树,并实现其基本方法.
其中,每一个数的节点用以下数据结构定义,每个节点都包括data域,左指针和右指针.
template <class T>
class BinNode
{
public:
BinNode();
BinNode(const T& data, BinNode<T> *l = NULL, BinNode<T> *r = NULL);
T data;
BinNode* left;
BinNode* right;
};
树的数据结构如下定义,包括根节点,数的节点统计变量.提供判断空,判断满和插入算法(其余算法在后续章节中陆续添加).
template <class T, unsigned int capacity>
class BinSearchTree
{
public:
BinSearchTree();
bool isEmpty();
bool isFull();
bool insert(T data);
private:
unsigned int treeNodeNum;
BinNode<T> *root;
};
算法实现如下:需要注意,模板T的数据类型应该至少是能够进行”<”或者”>”比较的数据类型.或者是实现了重载这两个运算符的数据结构.否则无法确定大小,也就无法决定如何插入.
#include "BinSearchTree.h"
template <class T>
BinNode<T>::BinNode()
{
left = NULL;
right = NULL;
}
template<class T>
BinNode<T>::BinNode(const T& data, BinNode<T> *l = NULL, BinNode<T> *r = NULL)
{
this->data = data;
left = l;
right = r;
}
template<class T, unsigned int capacity>
BinSearchTree<T, capacity>::BinSearchTree()
{
root = NULL;
treeNodeNum = 0;
}
template<class T, unsigned int capacity>
bool BinSearchTree<T, capacity>::isEmpty()
{
bool rs = false;
if ((0 == treeNodeNum) && (NULL == root))
{
rs = true;
}
return rs;
}
template<class T, unsigned int capacity>
bool BinSearchTree<T, capacity>::isFull()
{
bool rs = false;
if (capacity == treeNodeNum)
{
rs = true;
}
return rs;
}
template<class T, unsigned int capacity>
bool BinSearchTree<T, capacity>::insert(T data)
{
bool rs = false;
if (isFull())
{
rs = false;
}
else if (isEmpty())
{
root = new BinNode<T>();
root->data = data;
rs = true;
}
else
{
BinNode<T>* parent = NULL;
BinNode<T>* node = root;
bool leftOrRight = false; //false means left, true means right
while (NULL != node)
{
parent = node;
if (data < node->data)
{
leftOrRight = false;
node = node->left;
}
else
{
leftOrRight = true;
node = node->right;
}
}
BinNode<T>* newNode = new BinNode<T>();
newNode->data = data;
if (leftOrRight)
{
parent->right = newNode;
}
else
{
parent->left = newNode;
}
}
return rs;
}