二叉树顺序.docx
- 文档编号:10670865
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:17
- 大小:37.48KB
二叉树顺序.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;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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 顺序
![提示](https://static.bdocx.com/images/bang_tan.gif)