二叉树顺序.docx

上传人:b****7 文档编号:10670865 上传时间:2023-02-22 格式:DOCX 页数:17 大小:37.48KB
下载 相关 举报
二叉树顺序.docx_第1页
第1页 / 共17页
二叉树顺序.docx_第2页
第2页 / 共17页
二叉树顺序.docx_第3页
第3页 / 共17页
二叉树顺序.docx_第4页
第4页 / 共17页
二叉树顺序.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

二叉树顺序.docx

《二叉树顺序.docx》由会员分享,可在线阅读,更多相关《二叉树顺序.docx(17页珍藏版)》请在冰豆网上搜索。

二叉树顺序.docx

二叉树顺序

二叉树-顺序

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

测试.cpp

#include"12.h"

 voidmain()

{

 statusi;

   intj;

positionp;

ﻩTElemtypee;

SqBiTreeT,s;

ﻩInitBiTree(T);

ﻩCreateBiTree(T);

ﻩcout<<"建立二叉树后,树空否?

"<

是,0:

否)树的深度="<<BiTreeDepth(T)<<endl;

 i=Root(T,e);

 if(i)

ﻩﻩ cout<<"二叉树的根为:

"<<e<

else

ﻩ cout<<"树空,无根"<

ﻩﻩ

ﻩcout<<"层序遍历二叉树"<<endl;

ﻩ LevelOrderTraver(T,visit);

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

PreOrderTraverse(T,visit);

cout<<"中序遍历二叉树"<<endl;

ﻩInOrderTraverse(T,visit);

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

PostOrderTraverse(T,visit);

cout<<"请输入待修改结点的层序号和本层序号"<

cin>>p.level>>p.order;

e=Value(T,p);

 cout<<"待修改的结点原值为:

"<

ﻩcin>>e;

ﻩAssign(T,p,e);//给p的位置赋为新值e

 cout<<"先序遍历二叉树"<<endl;

ﻩ PreOrderTraverse(T,visit);

ﻩcout<<"结点"<

";

ﻩcout<<LeftChild(T,e)<<","<<RightChild(T,e)<<"左右兄弟分别为";

 cout<<LeftSibiling(T,e)<<","<<RightSibling(T,e)<

ﻩInitBiTree(s);

  cout<<"建立右子树为空的树s"<

ﻩCreateBiTree(s);

ﻩ cout<<"树s插入到树T中,请输入树T中s的双亲结点s为左(0)或右(0)子树:

"<

   cin>>e>>j;

ﻩ InsertChild(T,e,j,s);

   Print(T);

cout<<"删除子树,请输入待删除的子树根结点的层号,本层序号 左(0)右(1)子树";

ﻩcin>>p.level>>p.order>>j;

ﻩﻩDeleteChild(T,p,j);

ﻩﻩPrint(T);

ﻩﻩ ClearBiTree(T);

ﻩﻩcout<<"清空二叉树后,树空否"<

i=Root(T,e);

ﻩﻩif(i)

ﻩﻩcout<<"二叉树的根为:

"<

ﻩelse

ﻩcout<<"树空,无根"<<endl;

 }

 

12.h

#include

#include<process.h>

#include

#include<iostream>

usingnamespacestd;

#define OK1

#defineFALSE0

#define ERROR0

#defineTRUE1

#defineMAX_TREE_SIZE100

typedefint status;

#defineCHAR1 //字符型

#define CHAR0//整型(二选一)

#ifCHAR

typedefchar TElemtype;

TElemtypeNil=' ';

#else

typedefintTElemtype;

TElemtype Nil=0;

#endif

typedefintQElemtype;

#include"G:

\学习\12年暑假\3——4队列\3——4队列\1.h"

typedefTElemtype SqBiTree[MAX_TREE_SIZE];

 

structposition

{

int level,order;//结点的层。

本层序号

 };

statusInitBiTree(SqBiTreeT)

{

ﻩinti;

ﻩfor(i=0;i

ﻩT[i]=Nil;

returnOK;

statusCreateBiTree(SqBiTreeT)

{//按照层次顺序输入二叉树中结点的值(字符型或者整型),构造顺序存储的二叉树T

ﻩinti=0;

 #ifCHAR

intl;

ﻩchars[MAX_TREE_SIZE];

ﻩcout<<"请按照层序输入二叉树中结点的值(字符),空格表示空节点,节点数<="<

"<

gets(s);

ﻩl=strlen(s);

for(;i<1;i++)

ﻩﻩ{

T[i]=s[i];

ﻩif(i!

=0&&T[(i+1)/2-1]==Nil&&T[i]!

=Nil)

ﻩ{

ﻩcout<<"出现无双亲的非根结点"<<T[i]<<endl;

exit(ERROR);

ﻩ }

ﻩ 

ﻩ}

  #else

cout<<"请按照层次顺序输入结点的值(整型),0表示空结点输入999结束节点数<="<

"<

while

(1)

ﻩ{cin>>T[i];

if(T[i]==999)

 break;

 if(i!

=0&&T[(i+1)/2-1]==Nil&&T[i]!

=Nil)

ﻩ {cout<<"出现无双亲的非根结点"<

exit(ERROR);

ﻩ}

  i++;

ﻩ}

while(i

ﻩ{

ﻩT[i]=Nil;

ﻩ i++;

ﻩ}

  #endif

ﻩreturnOK;

 }

#defineClearBiTreeInitBiTree

statusBiTreeEmpty(SqBiTreeT)

{//初始条件:

二叉树T存在,操作结果:

空则返回TRUE否则返回FALSE

if(T[0]==Nil)

ﻩreturnTRUE;

else

ﻩreturnFALSE;

intBiTreeDepth(SqBiTreeT)

{//初始条件:

二叉树T存在操作结果:

返回T的深度

ﻩint i,j=-1;

 for(i=MAX_TREE_SIZE-1;i>=0;i--)

ﻩif(T[i]!

=Nil)

ﻩbreak;

ﻩi++;

 do

   j++;

ﻩﻩwhile (i>=pow(2,j));

returnj;

 }

statusRoot(SqBiTree T,TElemtype&e)

{//初始条件:

二叉树T存在。

操作结果:

当T不空,用e返回T的根,返回OK;否则返回ERROR,e无意义

if(BiTreeEmpty(T))

ﻩreturnERROR;

else

ﻩ{

e=T[0];

returnOK;

ﻩ}

}

TElemtypeValue(SqBiTreeT,positione)

{//初始条件:

二叉树T存在,e是T中某个节点(的位置)

ﻩ//操作结果:

返回e的结点处的值

return T[int(pow(2,e.level-1)+e.order-2)];

}

statusAssign(SqBiTreeT,positione,TElemtypevalue)

{//初始条件:

二叉树T存在,e是T中某个节点(的位置)

ﻩ//操作结果:

给处于位置e(层,本层序号)的结点赋新值value

inti=int(pow(2,e.level-1)+e.order-2);

ﻩif(value!

=Nil&&(T[(i+1)/2-1]==Nil))//叶子不空但是双亲为空

ﻩreturnERROR;

ﻩelse

ﻩif(value==Nil&&(T[i*2+1]!

=Nil||T[i*2+2]!

=Nil))//给双亲赋空值但是给叶子赋非空值

ﻩﻩﻩreturnERROR;

T[i]=value;

ﻩﻩreturnOK;

}

TElemtypeParent(SqBiTreeT,TElemtypee)

{//初始条件:

二叉树T存在,e是T中的某个节点

ﻩ//操作结果:

若e是T的非根结点,则返回它的双亲,否则返回空

inti;

ﻩif(T[0]==Nil)

ﻩﻩreturnNil;

for(i=1;i

if(T[i]==e)

returnT[(i+1)/2-1];

ﻩreturnNil;

}

TElemtypeLeftChild(SqBiTree T,TElemtypee)

{//初始条件 :

二叉树T存在,e是T中某个结点

ﻩ//操作结果:

返回e的左孩子若e无左孩子,则返回空

inti;

if(T[0]==Nil)

ﻩﻩreturnNil;

ﻩfor(i=0;i

ﻩif(T[i]==e)

ﻩ returnT[i*2+1];

ﻩ returnNil;

}

TElemtypeRightChild(SqBiTreeT,TElemtypee)

{//初始条件:

二叉树T存在,e是T中某个结点

ﻩ//操作结果:

返回e的右孩子若e无右孩子,则返回空

inti;

if(T[0]==Nil)

ﻩﻩreturnNil;

ﻩfor(i=0;i<MAX_TREE_SIZE;i++)

ﻩﻩ if(T[i]==e)

ﻩreturnT[i*2+2];

return Nil;

}

TElemtypeLeftSibiling(SqBiTreeT,TElemtypee)

{//初始条件:

二叉树T存在,e是T中某个结点

//操作结果:

返回e的右兄弟,若e是T的左孩子或无左兄弟,则返回 “空”

ﻩint i;

ﻩif(T[0]==Nil)//空树

ﻩreturnNil;

for(i=1;i<MAX_TREE_SIZE;i++)

ﻩif(T[i]==e&&i%2==0)

ﻩﻩreturnT[i-1];

ﻩreturnNil;

TElemtypeRightSibling(SqBiTreeT,TElemtypee)

{ //初始条件:

二叉树T存在,e是T中某个结点

//操作结果:

返回e的右兄弟,若e是T的右孩子或无右兄弟,则返回“空”

ﻩinti;

ﻩif(T[0]==Nil)

ﻩreturn Nil;

for(i=1;i<=MAX_TREE_SIZE-1;i++)

if(T[i]==e&&i%2)

ﻩreturnT[i+1];

returnNil;

}

voidMove(SqBiTreeq,int j,SqBiTreeT,inti)

{//把从q的j结点开始的子树移为从T的i结点开始的子树

  if(q[2*j+1]!

=Nil)//q的左子树不空

ﻩ Move(q,(2*j+1),T,(2*i+1));

ﻩ if(q[2*j+2]!

=Nil)

ﻩﻩMove(q,(2*j+2),T,(2*i+2));

ﻩ T[i]=q[j];

ﻩ q[j]=Nil;

}

statusInsertChild(SqBiTree T,TElemtypep,statusLR,SqBiTreec)

{//初始条件:

二叉树T存在,p是T中某个结点的值,LR为0或1,非空二叉树c与T不

ﻩ// 操作结果:

根据LR为0或1插入c为T中p结点的左或右子树

intj,k,i=0;

for(j=0;j

ﻩif(T[j]==p) //j为p的序号

ﻩﻩbreak;

k=2*j+1+LR;  //k为p的左或右孩子的序号

if( T[k]!

=Nil)//p原来的左孩子或右孩子不空

ﻩMove(T,k,T,2*k+2);//把从T的k结点开始的子树移为 T从k结点的右子树开始的子树

 Move(c,i,T,k);//把从c的i结点开始的子树移为从T的k结点开始的子树

returnOK;

}

statusDeleteChild(SqBiTreeT,positionp,intLR)

{ //初始条件:

二叉树T存在,p指向T中某个结点 LR为

 //操作结果:

根据LR为1或0删除T中所指结点的左或右子树

inti;

status k=OK;

ﻩLinkQueueq;

InitQueue(q);

i=(int)pow(2,p.level-1)+p.order-2;

ﻩif(T[i]==Nil)

ﻩﻩreturn ERROR;

i=i*2+1+LR;

while(k)

{

if(T[2*i+1]!

=Nil)//左结点不空

ﻩEnQueue(q,2*i+1);//入队左节点的序号

ﻩif(T[2*i+2]!

=Nil)//右结点不空

ﻩEnQueue(q,2*i+2); //入队右结点的序号

ﻩT[i]=Nil;//删除此结点

k=DeQueue(q,i);//队列不空

ﻩ}

return OK;

status(*VisitFunc)(TElemtype);

voidPreTraverse(SqBiTreeT,inte)

{//先序遍历

ﻩVisitFunc(T[e]);//遍历根结点

ﻩif(T[2*e+1]!

=Nil) //左子树不空

ﻩﻩPreTraverse(T,2*e+1);//先序遍历左子树

ﻩif(T[2*e+2]!

=Nil)

ﻩPreTraverse(T,2*e+2);

statusPreOrderTraverse(SqBiTreeT,status(*visit)(TElemtype))

{//初始条件:

二叉树存在。

visit是对结点操作的应用函数

//操作结果:

先序遍历T,对每个结点调用函数visit依次且仅依次

VisitFunc=visit;

ﻩif(!

BiTreeEmpty(T))//树不空

ﻩPreTraverse(T,0);

ﻩcout<<endl;

return OK;

 }

voidInTravere(SqBiTree T,inte)

{

if(T[2*e+1]!

=Nil)  

ﻩInTravere(T,2*e+1); //中序遍历左子树

ﻩVisitFunc(T[e]);  //访问根节点

ﻩif(T[2*e+2]!

=Nil)   //右子树不空

ﻩInTravere(T,2*e+2);//中序遍历右子树

}

statusInOrderTraverse(SqBiTreeT,status(*visit)(TElemtype))

{//初始条件:

二叉树存在,visit是对点的操作应用函数

//操作结果:

中序遍历T对每个结点调用函数visit一次且仅一次 一旦visit调用失败则操作失败

VisitFunc=visit;

if(!

BiTreeEmpty(T))//

ﻩInTravere(T,0);

ﻩcout<<endl;

ﻩreturnOK;

}

void PostTraverse(SqBiTreeT,int e)

{//

ﻩif(T[2*e+1]!

=Nil)//

PostTraverse(T,2*e+1);

ﻩif(T[2*e+2]!

=Nil)

PostTraverse(T,2*e+2);

ﻩVisitFunc(T[e]);

}

statusPostOrderTraverse(SqBiTree T,status(*visit)(TElemtype))

{//初始条件:

二叉树T存在,Visit是对结点操作的应用函数

//操作结果:

后续遍历T,对每个结点调用函数visiit一次且仅一次一旦调用失败则返回

VisitFunc=visit;

ﻩif(!

BiTreeEmpty(T))

PostTraverse(T,0);

cout<

 returnOK;

}

voidLevelOrderTraver(SqBiTreeT,status(*visit)(TElemtype))

{//层序遍历二叉树

ﻩint i=MAX_TREE_SIZE-1,j;

ﻩwhile(T[i]==Nil)

ﻩi--;//找到最后一个非空结点的序号

 for(j=0;j<=i;j++)

ﻩ if(T[j]!

=Nil)

 visit(T[j]);

 cout<<endl;

}

void Print(SqBiTreeT)

{//层序,按照本层序号输出二叉树

intj,k;

ﻩposition p;

ﻩTElemtype e;

ﻩ for(j=1;j<=BiTreeDepth(T);j++)

ﻩ{

 cout<<"第"<

for(k=1;k<=pow(2,j-1);k++)

ﻩ  {p.level=j;

 p.order=k;

ﻩ e=Value(T,p);

if(e!

=Nil)

cout<<k<<':

'<<e<<'';

ﻩ}

cout<<endl;ﻩ 

ﻩ}

}

statusvisit(TElemtypee)

{cout<

return OK;

}

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

当前位置:首页 > 工程科技 > 能源化工

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

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