您的位置:首页 > 理论基础 > 数据结构算法

C++模板实现二叉查找树(一 树的数据结构定义与节点插入)

2017-03-27 22:33 766 查看
树是一种基本的数据结构.二叉查找树以其高效的搜索效率而被在大数据搜索中广泛应用.本系列文章旨在建立二叉查找树,并实现其基本方法.

其中,每一个数的节点用以下数据结构定义,每个节点都包括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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: