二叉树顺序.docx
《二叉树顺序.docx》由会员分享,可在线阅读,更多相关《二叉树顺序.docx(17页珍藏版)》请在冰豆网上搜索。
二叉树顺序
二叉树-顺序
————————————————————————————————作者:
————————————————————————————————日期:
ﻩ
测试.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;iif(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;
}