bool insertElement(Element value); //插入元素
void inorderTree(CTreeNode<Element> *root); //中序遍历
CTreeNode<Element> * minValue(CTreeNode<Element> * root); //返回最小值结点
CTreeNode<Element> * maxValue(CTreeNode<Element> * root); //返回最大值结点
CTreeNode<Element> * search( Element value); //查找元素
bool deleteValue(Element value); //删除元素
CTreeNode<Element> * parent(CTreeNode<Element> * child); //查找父结点
CTreeNode<Element> * postNode(CTreeNode<Element> * node); //后继结点
public:
CTreeNode<Element> *root;
};
}
#endif
实现文件 binaryTree.cpp
#include "binaryTree.h"
using namespace binarytree;
template<typename Element>
CBinaryTree<Element>::CBinaryTree()
{
root = NULL;
}
template<typename Element>
CBinaryTree<Element>::~CBinaryTree()
{
root = NULL;
}
template<typename Element>
bool CBinaryTree<Element>::treeEmpty()
{
return root == NULL;
}
template<typename Element>
bool CBinaryTree<Element>::insertElement(Element value)
{
CTreeNode<Element> *p = root;
CTreeNode<Element> *q = NULL;
while ( p != NULL )
{
q = p;
if ( value < p->key )
p = p->lchild;
else
p = p->rchild;
}
if ( q == NULL )
{
root = new CTreeNode<Element>(value);
return true;
}
else if ( value < q->key )
{
q->lchild = new CTreeNode<Element>(value);
return true;
}
else
{
q->rchild = new CTreeNode<Element>(value);
return true;
}
return false;
}
template<typename Element>
void CBinaryTree<Element>::inorderTree(CTreeNode<Element> *root)
{
if ( root != NULL )
{
inorderTree(root->lchild);
cout<<root->key<<endl;
inorderTree(root->rchild);
}
}
template<typename Element>
CTreeNode<Element> * CBinaryTree<Element>::search(Element value)
{
CTreeNode<Element> *p = root;
while ( p != NULL && p->key != value)
{
if ( value < p->key )
p = p->lchild;
else
p = p->rchild;
}
return p;
}
template<typename Element>
CTreeNode<Element> * CBinaryTree<Element>::parent(CTreeNode<Element> * child)
{
CTreeNode<Element> *p = root;
CTreeNode<Element> *q = NULL;
while ( p != NULL && p->key != child->key )
{
q = p;
if( p->key > child->key )
{
p = p->lchild;
}
else
{
p = p->rchild;
}
}
return q;
}
template<typename Element>
CTreeNode<Element> * CBinaryTree<Element>::minValue(CTreeNode<Element> * root)
{
CTreeNode<Element> *p = root;
while ( p->lchild != NULL)
{
p = p->lchild;
}
return p;
}
template<typename Element>
CTreeNode<Element> * CBinaryTree<Element>::maxValue(CTreeNode<Element> * root)
{
CTreeNode<Element> *p = root;
while ( p->rchild != NULL)
{
p = p->rchild;
}
return p;
}
template<typename Element>
CTreeNode<Element> * CBinaryTree<Element>::postNode(CTreeNode<Element> * node)
{
if( node->rchild != NULL )
return minValue(node->rchild);
CTreeNode<Element> *p = node;
CTreeNode<Element> *par = parent(p);
while ( par != NULL && par->rchild == p )
{
p = par;
par = parent(p);
}
return par;
}
template<typename Element>
bool CBinaryTree<Element>::deleteValue(Element Value)
{
CTreeNode<Element> * p = search(Value);
CTreeNode<Element> * q = NULL;
CTreeNode<Element> * s = NULL;
if ( p->lchild == NULL || p->rchild == NULL )
{
q = p;
}
else
q = postNode(p);
s = parent(q);
if ( q->lchild != NULL )
{
if ( s != NULL && s->lchild == q )
s->lchild = q->lchild;
else if ( s != NULL && s->rchild == q )
s->rchild = q->lchild;
}
else
{
if ( s != NULL && s->lchild == q )
s->lchild = q->rchild;
else if ( s != NULL && s->rchild == q )
s->rchild = q->rchild;
}
if ( s == NULL )
root->key = q->key;
if ( q != p )
p->key = q->key;
delete q;
return true;
}
主函数