二叉树顺序.docx
- 文档编号:27905927
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:16
- 大小:50.46KB
二叉树顺序.docx
《二叉树顺序.docx》由会员分享,可在线阅读,更多相关《二叉树顺序.docx(16页珍藏版)》请在冰豆网上搜索。
二叉树顺序
二叉树-顺序
cout<<"先序遍历二叉树"< PreOrderTraverse(T,visit); cout<<"结点"< "; cout< cout< 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<<"树空,无根"< } 12.h #include #include #include #include usingnamespacestd; #defineOK1 #defineFALSE0 #defineERROR0 #defineTRUE1 #defineMAX_TREE_SIZE100 typedefintstatus; #defineCHAR1//字符型 #defineCHAR0//整型(二选一) #ifCHAR typedefcharTElemtype; TElemtypeNil=''; #else typedefintTElemtype; TElemtypeNil=0; #endif typedefintQElemtype; #include"G: \学习\12年暑假\3——4队列\3——4队列\1.h" typedefTElemtypeSqBiTree[MAX_TREE_SIZE]; structposition { intlevel,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<<"出现无双亲的非根结点"< 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的深度 inti,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(SqBiTreeT,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的结点处的值 returnT[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(SqBiTreeT,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 if(T[i]==e) returnT[i*2+2]; returnNil; } TElemtypeLeftSibiling(SqBiTreeT,TElemtypee) {//初始条件: 二叉树T存在,e是T中某个结点 //操作结果: 返回e的右兄弟,若e是T的左孩子或无左兄弟,则返回“空” inti; if(T[0]==Nil)//空树 returnNil; for(i=1;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) returnNil; for(i=1;i<=MAX_TREE_SIZE-1;i++) if(T[i]==e&&i%2) returnT[i+1]; returnNil; } voidMove(SqBiTreeq,intj,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(SqBiTreeT,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; statusk=OK; LinkQueueq; InitQueue(q); i=(int)pow(2,p.level-1)+p.order-2; if(T[i]==Nil) returnERROR; 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);//队列不空 } returnOK; } 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< returnOK; } voidInTravere(SqBiTreeT,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< returnOK; } voidPostTraverse(SqBiTreeT,inte) {// 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(SqBiTreeT,status(*visit)(TElemtype)) {//初始条件: 二叉树T存在,Visit是对结点操作的应用函数 //操作结果: 后续遍历T,对每个结点调用函数visiit一次且仅一次一旦调用失败则返回 VisitFunc=visit; if(! BiTreeEmpty(T)) PostTraverse(T,0); cout< returnOK; } voidLevelOrderTraver(SqBiTreeT,status(*visit)(TElemtype)) {//层序遍历二叉树 inti=MAX_TREE_SIZE-1,j; while(T[i]==Nil) i--;//找到最后一个非空结点的序号 for(j=0;j<=i;j++) if(T[j]! =Nil) visit(T[j]); cout< } voidPrint(SqBiTreeT) {//层序,按照本层序号输出二叉树 intj,k; positionp; TElemtypee; 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< '< } cout< } } statusvisit(TElemtypee) {cout< returnOK; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 顺序