数据结构二叉树基本操作源代码.docx

上传人:b****6 文档编号:4589413 上传时间:2022-12-07 格式:DOCX 页数:27 大小:21.67KB
下载 相关 举报
数据结构二叉树基本操作源代码.docx_第1页
第1页 / 共27页
数据结构二叉树基本操作源代码.docx_第2页
第2页 / 共27页
数据结构二叉树基本操作源代码.docx_第3页
第3页 / 共27页
数据结构二叉树基本操作源代码.docx_第4页
第4页 / 共27页
数据结构二叉树基本操作源代码.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

数据结构二叉树基本操作源代码.docx

《数据结构二叉树基本操作源代码.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树基本操作源代码.docx(27页珍藏版)》请在冰豆网上搜索。

数据结构二叉树基本操作源代码.docx

数据结构二叉树基本操作源代码

数据结构二叉树基本操作

 

(1).

//对二叉树的基本操作的类模板封装

//------------------------------------------------------------------------------------------------------------------------

#include

usingnamespacestd;

//------------------------------------------------------------------------------------------------------------------------

//定义二叉树的结点类型BTNode,其中包含数据域、左孩子,右孩子结点。

template

structBTNode

{

Tdata;//数据域

BTNode*lchild;//指向左子树的指针

BTNode*rchild;//指向右子树的指针

};

//------------------------------------------------------------------------------------------------------------------------

//CBinary的类模板

template

classBinaryTree

{

BTNode*BT;

public:

BinaryTree(){BT=NULL;}//构造函数,将根结点置空

~BinaryTree(){clear(BT);}//调用Clear()函数将二叉树销毁

voidClearBiTree(){clear(BT);BT=NULL;};//销毁一棵二叉树

voidCreateBiTree(Tend);//创建一棵二叉树,end为空指针域标志

boolIsEmpty();//判断二叉树是否为空

intBiTreeDepth();//计算二叉树的深度

boolRootValue(T&e);//若二叉树不为空用e返回根结点的值,函数返回true,否则函数返回false

BTNode*GetRoot();//二叉树不为空获取根结点指针,否则返回NULL

boolAssign(Te,Tvalue);//找到二叉树中值为e的结点,并将其值修改为value。

TGetParent(Te);//若二叉树不空且e是二叉树中的一个结点那么返回其双亲结点值

TGetLeftChild(Te);//获取左孩子结点值

TGetRightChild(Te);//获取右孩子结点值

TGetLeftSibling(Te);//获取左兄弟的结点值

Trightsibling(BTNode*p,Te);

TGetRightSibling(Te);//获取右孩子的结点值

boolInsertChild(BTNode*p,BTNode*c,intRL);//插入操作

boolDeleteChild(BTNode*p,intRL);//删除操作

voidPreTraBiTree();//递归算法:

先序遍历二叉树

voidInTraBiTree();//递归算法:

中序遍历二叉树

voidPostTraBiTree();//递归算法:

后序遍历二叉树

voidPreTraBiTree_N();//非递归算法:

先序遍历二叉树

voidInTraBiTree_N();//非递归算法:

中序遍历二叉树

voidLevelTraBiTree();//利用队列层次遍历二叉树

intLeafCount();//计算叶子结点的个数

BTNode*SearchNode(Te);//寻找到结点值为e的结点,返回指向结点的指针

voidDisplayBTreeShape(BTNode*bt,intlevel=1);

};

//二叉树的树形显示算法

template

voidBinaryTree:

:

DisplayBTreeShape(BTNode*bt,intlevel)

{

if(bt)//空二叉树不显示

{DisplayBTreeShape(bt->rchild,level+1);//显示右子树

cout<

for(inti=0;i

cout<<"";//确保在第level列显示节点

cout<data;//显示节点

DisplayBTreeShape(bt->lchild,level+1);//显示左子树

}//if

}//DisplayBTree

template

staticintclear(BTNode*bt)

{//销毁一棵二叉树

if(bt)//根结点不空

{

clear(bt->lchild);//递归调用Clear()函数销毁左子树

clear(bt->rchild);//递归调用Clear()函数销毁右子树

cout<<"释放了指针"<

"<

deletebt;//释放当前访问的根结点

}

return0;

}

template

voidBinaryTree:

:

CreateBiTree(Tend)

{//创建一棵二叉树:

先序序列的顺序输入数据,end为结束的标志

cout<<"请按先序序列的顺序输入二叉树,-1为空指针域标志:

"<

BTNode*p;

Tx;

cin>>x;//输入根结点的数据

if(x==end)return;//end表示指针为空,说明树为空

p=newBTNode;//申请内存

if(!

p)

{

cout<<"申请内存失败!

"<

exit(-1);//申请内存失败退出

}

p->data=x;

p->lchild=NULL;

p->rchild=NULL;

BT=p;//根结点

create(p,1,end);//创建根结点左子树,1为标志,表示左子树

create(p,2,end);//创建根结点右子树,2为标志,表示右子树

}

template

staticintcreate(BTNode*p,intk,Tend)

{//静态函数,创建二叉树,k为创建左子树还是右子树的标志,end为空指针域的标志

BTNode*q;

Tx;

cin>>x;

if(x!

=end)

{//先序顺序输入数据

q=newBTNode;

q->data=x;

q->lchild=NULL;

q->rchild=NULL;

if(k==1)p->lchild=q;//q为左子树

if(k==2)p->rchild=q;//p为右子树

create(q,1,end);//递归创建左子树

create(q,2,end);//递归创建右子树

}

return0;

}

 

template

boolBinaryTree:

:

IsEmpty()

{//判断二叉树是否为空

if(BT==NULL)returntrue;//树根结点为空,说明树为空

returnfalse;

}

template

intBinaryTree:

:

BiTreeDepth()

{//利用递归算法计算树的深度

BTNode*bt=BT;//树根结点

intdepth=0;//开始的时候数的深度初始化为0

if(bt)//如果树不为空

Depth(bt,1,depth);

returndepth;

}

template

staticintDepth(BTNode*p,intlevel,int&depth)

{//这个函数由BiTreeDepth()函数调用完成树的深度的计算

//其中p是根结点,Level是层,depth用来返回树的深度

if(level>depth)depth=level;

if(p->lchild)Depth(p->lchild,level+1,depth);//递归的遍历左子树,并且层数加1

if(p->rchild)Depth(p->rchild,level+1,depth);//递归的遍历右子树,并且层数加1

return0;

}

template

boolBinaryTree:

:

RootValue(T&e)

{//若二叉树不为空用e返回根结点的值,函数返回true,否则函数返回false

if(BT!

=NULL)//判断二叉树是否为空

{

e=BT->data;//若不空,则将根结点的数据赋值给e

returntrue;//操作成功,返回true

}

returnfalse;//二叉树为空,返回false

}

template

BTNode*BinaryTree:

:

GetRoot()

{//获取根信息

returnBT;//返回根结点的指针,若二叉树为空那么返回NULL

}

template

boolBinaryTree:

:

Assign(Te,Tvalue)

{//结点赋值

if(SearchNode(e)!

=NULL)

{

(SearchNode(e))->data=value;

returntrue;

}

returnfalse;

}

template

TBinaryTree:

:

GetParent(Te)

{//获取双亲信息

BTNode*Queue[200],*p;

intrear,front;

rear=front=0;

if(BT)

{

Queue[rear++]=BT;

while(rear!

=front)

{

p=Queue[front++];

if(p->lchild&&p->lchild->data==e||p->rchild&&p->rchild->data==e)

returnp->data;

else

{

if(p->lchild)Queue[rear++]=p->lchild;

if(p->rchild)Queue[rear++]=p->rchild;

}

}

}

returnNULL;

}

template

TBinaryTree:

:

GetRightChild(Te)

{//如果二叉树存在,e是二叉树中的一个结点,右子树存在那么返回右子树的结点值,否则返回0并提示右子树为空

BTNode*p=SearchNode(e);

if(p->rchild)returnp->rchild->data;//右子树不空,返回右子树根结点的值

cout<<"结点"<

return0;

}

template

TBinaryTree:

:

GetLeftChild(Te)

{//如果二叉树存在,e是二叉树中的一个结点,左子树存在那么返回左子树的结点值,否则返回0并提示左子树为空

BTNode*p=SearchNode(e);

if(p->lchild)returnp->lchild->data;

cout<<"结点"<

return0;

}

template

TBinaryTree:

:

GetLeftSibling(Te)

{//获取左兄弟信息

if(BT!

=NULL)

{

returnleftsibling(BT,e);

}

else

{//二叉树为空

cout<<"二叉树为空!

"<

return0;

}

}

template

Tleftsibling(BTNode*p,Te)

{

Tq=0;

if(p==NULL)return0;

else

{

if(p->rchild)

{

if(p->rchild->data==e)

{

if(p->lchild)returnp->lchild->data;

else

returnNULL;

}

}

q=leftsibling(p->lchild,e);

if(q)returnq;

q=leftsibling(p->rchild,e);

if(q)returnq;

}

return0;

}

//------------------------------------------------------------------------------------------------------------------------

template

TBinaryTree:

:

GetRightSibling(Te)

{//获取右兄弟信息

if(BT!

=NULL)

{

returnrightsibling(BT,e);

}

else

{//二叉树为空

cout<<"二叉树为空!

"<

return0;

}

}

template

TBinaryTree:

:

rightsibling(BTNode*p,Te)

{

BTNode*q=SearchNode(e);

BTNode*pp;

if(q)

{

pp=SearchNode(GetParent(e));

if(pp)

{

if(pp->rchild)returnpp->rchild->data;

elsereturn0;

}

elsereturn0;

}

return0;

}

template

boolBinaryTree:

:

InsertChild(BTNode*p,BTNode*c,intLR)

{//插入孩子

if(p)

{

if(LR==0)

{

c->rchild=p->lchild;

p->lchild=c;

}

else

{

c->rchild=p->rchild;

p->rchild=c;

}

returntrue;

}

returnfalse;//p为空

}

//------------------------------------------------------------------------------------------------------------------------

template

boolBinaryTree:

:

DeleteChild(BTNode*p,intRL)

{//删除结点

if(p)

{

if(RL==0)

{

clear(p->lchild);//释放p右子树的所有结点空间

p->lchild=NULL;

}

else

{

clear(p->rchild);

p->rchild=NULL;

}

returntrue;//删除成功

}

returnfalse;//p为空

}

//------------------------------------------------------------------------------------------------------------------------

template

voidBinaryTree:

:

PreTraBiTree()

{//先序遍历二叉树

cout<<"----------------------------------------------"<

cout<<"先序遍历二叉树:

";

BTNode*p;

p=BT;//根结点

PreTraverse(p);//从根结点开始先序遍历二叉树

cout<

cout<<"----------------------------------------------"<

}

template

staticintPreTraverse(BTNode*p)

{

if(p!

=NULL)

{

cout<data<<'';//输出结点上的数据

PreTraverse(p->lchild);//递归的调用前序遍历左子树

PreTraverse(p->rchild);//递归的调用前序遍历右子树

}

return0;

}

//------------------------------------------------------------------------------------------------------------------------

template

voidBinaryTree:

:

InTraBiTree()

{//中序遍历二叉树

cout<<"----------------------------------------------"<

cout<<"中序遍历二叉树:

";

BTNode*p;

p=BT;//根结点

InTraverse(p);//从根结点开始中序遍历二叉树

cout<

cout<<"----------------------------------------------"<

}

template

staticintInTraverse(BTNode*p)

{

if(p!

=NULL)

{

InTraverse(p->lchild);//递归的调用中序遍历左子树

cout<data<<'';//输出结点上的数据

InTraverse(p->rchild);//递归的调用中序遍历右子树

}

return0;

}

//------------------------------------------------------------------------------------------------------------------------

template

voidBinaryTree:

:

PostTraBiTree()

{//后序遍历二叉树

cout<<"----------------------------------------------"<

cout<<"后序遍历二叉树:

";

BTNode*p;

p=BT;//根结点

PostTraverse(p);//从根结点开始遍历二叉树

cout<

cout<<"----------------------------------------------"<

}

template

staticintPostTraverse(BTNode*p)

{

if(p!

=NULL)

{

PostTraverse(p->lchild);//递归调用后序遍历左子树

PostTraverse(p->rchild);//递归调用后序遍历右子树

cout<data<<'';//输出结点上的数据

}

return0;

}

//------------------------------------------------------------------------------------------------------------------------

template

voidBinaryTree:

:

PreTraBiTree_N()

{//

cout<<"----------------------------------------------"<

cout<<"先序(非递归)遍历二叉树得:

";

BTNode*Stack[200];//利用指针数组作为栈

inttop=0;

BTNode*p=BT;//将根结点的指针赋值给p

while(p!

=NULL||top!

=0)

{

while(p!

=NULL)

{

cout<data<<"";

Stack[top++]=p->rchild;

p=p->lchild;

}

if(top!

=0)

{

p=Stack[--top];

}

}

cout<<"\n----------------------------------------------"<

}

//------------------------------------------------------------------------------------------------------------------------

template

voidBinaryTree:

:

InTraBiTree_N(

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1