头文件:
#include
using namespace std;
template
class Bintree;
//结点类
template
class BintreeNode
{
friend class Bintree
public:
BintreeNode() :data(Type()), leftchild(NULL), rightchild(NULL)
{}
BintreeNode(Type d, BintreeNode
{}
private:
BintreeNode
BintreeNode
Type data;
};
//二叉树类
template
class Bintree
{
public:
Bintree() :Ref(Type()), root(NULL)
{}
Bintree(Type re, BintreeNode
{}
~Bintree()
{
Destory();
}
public:
//提供接口
void CreatBintree()
{
Creat(root);
}
void PreOrder()
{
PreOrder(root);
}
void InOrder()
{
InOrder(root);
}
void PostOrder()
{
PostOrder(root);
}
int Height()
{
return Height(root);
}
int Size()
{
return Size(root);
}
BintreeNode<Type> \*Search(Type key)
{
return Search(root, key);
}
BintreeNode<Type> \*PreOrder\_Find(Type key)
{
return PreOrder\_Find(root, key);
}
BintreeNode<Type> \*InOrder\_Find(Type key)
{
return InOrder\_Find(root, key);
}
BintreeNode<Type> \*PostOrder\_Find(Type key)
{
return PostOrder\_Find(root, key);
}
BintreeNode<Type> \*Parent(BintreeNode<Type> \*q)
{
return Parent(root, q);
}
BintreeNode<Type> \*Leftchild(Type key)
{
return Leftchild(root, key);
}
BintreeNode<Type> \*Rightchild(Type key)
{
return Rightchild(root, key);
}
Type Root()
{
return Root(root);
}
void Destory()
{
return Destory(root);
}
bool IsEmpty()
{
return IsEmpty(root);
}
void quit\_system(int &x)
{
x = 0;
}
protected:
//创建二叉树
void Creat(BintreeNode
{
Type input;
cin >> input;
if (input == Ref)
{
t = NULL;
}
else
{
t = new BintreeNode
Creat(t->leftchild);
Creat(t->rightchild);
}
}
// 前序遍历
void PreOrder(const BintreeNode<Type> \*t)
{
if (t == NULL)
{
return;
}
else
{
cout << t->data << " ";
PreOrder(t->leftchild);
PreOrder(t->rightchild);
}
}
// 中序遍历
void InOrder(const BintreeNode<Type> \*t)
{
if (t == NULL)
{
return;
}
else
{
InOrder(t->leftchild);
cout << t->data << " ";
InOrder(t->rightchild);
}
}
// 后序遍历
void PostOrder(const BintreeNode<Type> \*t)
{
if (t == NULL)
{
return;
}
else
{
PostOrder(t->leftchild);
PostOrder(t->rightchild);
cout << t->data << " ";
}
}
// 求高度
int Height(const BintreeNode<Type> \*t)
{
if (t == NULL)
return 0;
return (Height(t->leftchild) > Height(t->rightchild)) ?
(Height(t->leftchild) + 1) : (Height(t->rightchild) + 1);
}
int Size(const BintreeNode<Type> \*t)
{
if (t == NULL)
return 0;
return(Size(t->leftchild) + Size(t->rightchild) + 1);
}
// 查找一个节点返回其地址
BintreeNode<Type> \*Search( BintreeNode<Type> \*t,const Type key)
{
if (t == NULL)
{
return NULL;
}
if (t->data == key)
return t;
BintreeNode<Type> \*p;
if ((p = Search(t->leftchild, key)) != NULL)
return p;
else
return Search(t->rightchild, key);
}
// 前序查找
BintreeNode<Type> \*PreOrder\_Find(BintreeNode<Type> \*t, const Type key)
{
if (t == NULL)
{
return NULL;
}
if (t->data == key)
return t;
BintreeNode<Type> \*p;
if ((p = PreOrder\_Find(t->leftchild, key)) != NULL)
return p;
else
return PreOrder\_Find(t->rightchild, key);
}
// 中序查找
BintreeNode<Type> \*InOrder\_Find(BintreeNode<Type> \*t, const Type key)
{
if (t == NULL)
{
return NULL;
}
BintreeNode<Type> \*p;
if ((p = InOrder\_Find(t->leftchild, key)) != NULL)
return p;
else if (t->data == key)
return t;
else
return InOrder\_Find(t->rightchild, key);
}
// 后序查找
BintreeNode<Type> \*PostOrder\_Find(BintreeNode<Type> \*t, const Type key)
{
if (t == NULL)
{
return NULL;
}
BintreeNode<Type> \*p;
BintreeNode<Type> \*q;
if ((p = PostOrder\_Find(t->leftchild, key)) != NULL)
return p;
else if ((q = PostOrder\_Find(t->rightchild, key)) != NULL)
return q;
else if (t->data = key)
return t;
}
// 求父节点并返回其父节点地址
BintreeNode<Type> \*Parent(BintreeNode<Type> \*&t, BintreeNode<Type> \*q)
{
if (t == NULL)
{
return t;
}
if (q == t->leftchild || q == t->rightchild || q == t)
{
return t;
}
BintreeNode<Type> \*p;
if ((p = Parent(t->leftchild, q)) != NULL)
{
return p;
}
else
return Parent(t->rightchild, q);
}
// 求左孩子
BintreeNode<Type> \*Leftchild(BintreeNode<Type> \*t, const Type key)
{
BintreeNode<Type> \*p = Search(t, key);
if (p == NULL)
{
cout << "the node is not exist!" << endl;
return NULL;
}
if (p->leftchild == NULL)
{
cout << "this node not has leftchild" << endl;
return NULL;
}
else
return p->leftchild;
}
// 求右孩子
BintreeNode<Type> \*Rightchild(BintreeNode<Type> \*t, const Type key)
{
BintreeNode<Type> \*p = Search(t, key);
if (p == NULL)
{
cout << "the node is not exist!" << endl;
return NULL;
}
if (p->rightchild == NULL)
{
cout << "this node not has rightchild" << endl;
return NULL;
}
else
return p->rightchild;
}
// 求根
Type Root(const BintreeNode<Type> \*t)
{
return t->data;
}
void Destory(const BintreeNode<Type> \*t)
{
if (t != NULL)
{
Destory(t->leftchild);
Destory(t->rightchild);
delete t;
}
}
// 看树是否为空
bool IsEmpty(const BintreeNode<Type> \*t)
{
return t == NULL;
}
private:
BintreeNode
Type Ref;
};
页面设计:
#include "Bintree.h"
int main()
{
Bintree
int select = 1;
char c;
while (select)
{
cout << "******************************************************************" << endl;
cout << "* [1] creat [2] PreOrder [3] InOrder *" << endl;
cout << "* [4] PostOrder [5] Height [6] Size *" << endl;
cout << "* [7] search [8] PreOrder_Find [9] InOrder_Find *" << endl;
cout << "* [10] PostOrder_Find [11] parent [12] leftchild *" << endl;
cout << "* [13] rightchild [14] root [15] destory *" << endl;
cout << "* [16] Isempty [17] quit_system *" << endl;
cout << "******************************************************************" << endl;
cout << "pleae choose:";
cin >> select;
switch (select)
{
case 1:
cout << "please enter:";
bt.CreatBintree();
break;
case 2:
bt.PreOrder();
cout << endl;
break;
case 3:
bt.InOrder();
cout << endl;
break;
case 4:
bt.PostOrder();
cout << endl;
break;
case 5:
cout << bt.Height() << endl;
break;
case 6:
cout << bt.Size() << endl;
break;
case 7:
cout << "please enter what u want to search:";
cin >> c;
cout << bt.Search(c) << endl;
break;
case 8:
cout << "please enter what u want to search:";
cin >> c;
cout << bt.PreOrder_Find(c) << endl;
break;
case 9:
cout << "please enter what u want to search:";
cin >> c;
cout << bt.InOrder_Find(c) << endl;
break;
case 10:
cout << "please enter what u want to search:";
cin >> c;
cout << bt.PostOrder_Find(c) << endl;
break;
case 11:
cout << "whose parent u wanna find:";
cin >> c;
cout << bt.Parent(bt.Search(c)) << endl;
break;
case 12:
cout << "whose leftchild u wanna find:";
cin >> c;
cout << bt.Leftchild(c) << endl;
break;
case 13:
cout << "whose rightchild u wanna find:";
cin >> c;
cout << bt.Rightchild(c) << endl;
break;
case 14:
cout << bt.Root() << endl;
break;
case 15:
bt.Destory();
break;
case 16:
if (bt.IsEmpty())
{
cout << "it is an empty bintree" << endl;
}
else
{
cout << "it is not an empty bintree" << endl;
}
break;
case 17:
bt.quit_system(select);
break;
default:
break;
}
}
return 0;
}
求高度:
中序遍历:
中序遍历查找:
推断是否为空树:
求其父节点:
后序遍历:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
前序遍历:
退出系统:
求其右孩子:
求根:
查找:
求节点个数:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章