1、软件:配有 Windows98/2000/XP 操作系统,安装 Visual C+ 。5、实验时间:10学时6、该文档的文件名不要修改,存入 命名的文件夹中7、该表中的数据只需填空,已有内容不要修改实验结果(运行结果界面及源程序,运行结果界面放在前面):#include stdafx.hiostream.hstring.henum Status OK=1,ERROR=0;typedef struct char name8; int number;team;struct BinaryTreeNodeteam data;BinaryTreeNode *LChild;BinaryTreeNode *
2、RChild;struct SType BinaryTreeNode *ptr; bool B;struct QType BinaryTreeNode *qtr;struct Stack SType *element; int top; int MaxSize;struct Queue QType *element; int front; int rear;void CreatStack(Stack &S,int &MaxStackSize)/构造一个最大容量为MaxStackSize的堆栈S S.MaxSize=MaxStackSize; S.element=new STypeS.MaxSi
3、ze; S.top=-1;bool IsEmpty(Stack &S)/判断堆栈S是否为空 if(S.top=-1) return true; return false;bool IsFull(Stack &/判断堆栈S是否为满 if(S.top=S.MaxSize-1) return true;Status Push(Stack &S,SType &x)/x进S栈,返回进栈后的状态值 if(IsFull(S) return ERROR; S.top+; S.elementS.top=x; return OK;Status Pop(Stack &/将S栈顶的值取至x中,返回出栈后的状态值 if
4、(IsEmpty(S) return ERROR; x=S.elementS.top; S.top-;void CreatQueue(Queue &Q,int &MaxQueueSize)/构造一个最大容量为MaxQueueSize的队列Q Q.MaxSize=MaxQueueSize; Q.element=new QTypeQ.MaxSize+1; Q.front=0; Q.rear=0;bool IsEmpty(Queue &Q)/判断队列Q是否为空 if(Q.front=Q.rear) return true;bool IsFull(Queue &/判断队列Q是否为满 if(Q.fron
5、t=(Q.rear+1)%(Q.MaxSize+1) return true;Status Enqueue(Queue &Q,QType &/x进Q队列,返回进队后的状态值 if(IsFull(Q) return ERROR; Q.elementQ.rear=x; Q.rear=(Q.rear+1)%(Q.MaxSize+1);Status Dequeue(Queue &/将Q队列队头的值取至x中,返回出队后的状态值 if(IsEmpty(Q) return ERROR; x=Q.elementQ.front; Q.front=(Q.front+1)%(Q.MaxSize+1);void Pr
6、eOrder(BinaryTreeNode *BT)/二叉树的前序遍历递归算法 if(BT) coutdata.name:data.numberLChild);RChild); void InOrder(BinaryTreeNode *BT)/二叉树的中序遍历递归算法 InOrder(BT-void PostOrder(BinaryTreeNode *BT)/二叉树的后序遍历递归算法 PostOrder(BT-void PreOrderN(BinaryTreeNode *BT)/二叉树的前序遍历非递归算法 Stack S; SType T; T.ptr=BT; int MaxStackSize
7、=50; CreatStack(S,MaxStackSize); while(T.ptr|!IsEmpty(S) if(T.ptr) cout/访问根结点 Push(S,T);/根结点指针进栈,以后回溯时再退栈 T.ptr=T.ptr-LChild;/指针指向访问过的结点左子树 else /左子树为空时,利用堆栈回溯 if(! Pop(S,T);/从堆栈中弹出回溯结点指针(该结点已访问过) T.ptr=T.ptr-RChild;/指针指向回溯结点的右子树 delete S.element;void InOrderN(BinaryTreeNode *BT)/二叉树的中序遍历非递归算法 do wh
8、ile(T.ptr) /找最左子树/结点(未访问)指针进栈,以后回溯时再退栈/指针指向 if(! /左子树为空时,利用堆栈回溯 Pop(S,T);/从堆栈中弹出回溯结点指针(该结点未访问过) while(T.ptr)|!IsEmpty(S);void PostOrderN(BinaryTreeNode *BT)/二叉树的后序遍历非递归算法 BinaryTreeNode *p=BT; SType temp; while(p)|! if(p) temp.B=false;/准备进栈的结点进栈标志设为第一次进栈 temp.ptr=p; Push(S,temp);/根结点(未访问)指针及标志进栈,以后回
9、溯时再退栈 p=p-/指针指向该 else /左子树为空时,利用堆栈回溯 Pop(S,temp);/从堆栈中弹出回溯结点指针及标志(该结点未访问过) p=temp.ptr;/p指向退栈结点,否则p的值是空 if(temp.B) cout/访问该结点 p=NULL;/将p设为空的目的是为强制退栈作准备 else temp.B=true;/改变进栈标志,准备重新进栈 Push(S,temp); p=p-的右子树 void LevelOrderTL(BinaryTreeNode *BT)/从左至右,从上至下按层次遍历一棵二叉树(Top_Left) Queue Q; QType D; D.qtr=BT
10、; BinaryTreeNode *q; int MaxQueueSize=50; CreatQueue(Q,MaxQueueSize);/产生一个空队列,这一过程函数可以不在这里进行 while(D.qtr)D.qtr- q=D.qtr; if(D.qtr-LChild) D.qtr=D.qtr- Enqueue(Q,D);/左子树进队 D.qtr=q;RChild) /右子树进队Dequeue(Q,D) return;/出队返回状码ERROR时结束(队空) delete Q.element;void LevelOrderTR(BinaryTreeNode *BT)/从右至左,从上至下按层次
11、遍历一棵二叉树(Top_Right)BinaryTreeNode *MakeNode(team &/构造结点 ptr=new BinaryTreeNode; if(!ptr) return NULL; ptr-data=x;LChild=NULL;RChild=NULL; return ptr;void MakeBinaryTree(BinaryTreeNode *root,BinaryTreeNode *left,BinaryTreeNode *right)/联接root,left,right所指的结点指针为二叉树 root-LChild=left;RChild=right;int Bina
12、ryHeight(BinaryTreeNode *BT)/返回二叉树的高度BT) return 0; int HighL=BinaryHeight(BT- int HighR=BinaryHeight(BT- if(HighLHighR) return +HighL; else return +HighR;void BinaryDelete(BinaryTreeNode *BT)/二叉树的删除算法 BinaryDelete(BT- delete BT;/这里的delete是系统过程void main() BinaryTreeNode *p11;int m=2; team x11; cout*T
13、he team of Information management and information system 0904*nPlease input the information of the team:n /*for(int i=1;ixi.name;Number:xi.number; pi=MakeNode(xi); */ char a1111=,dingcailiuxuanwuzhuyangjiangliaozhou int b11=0,14,24,3,11,10,5,1,8,17,21; for(int i=1;i+) strcpy(xi.name,ai); xi.number=b
14、i; for(i=1;=5;i+)/构造二叉树 if(i=5) pi-LChild=p2*i; else MakeBinaryTree(pi,p2*i,p2*i+1); /输出二叉树的结构The binarytree is: _x1.namex1.number_endl; _x2.namex2.number_ _x3.namex3.number_ _x4.namex4.number_ _x5.namex5.number x6.namex6.numberx7.namex7.numberx8.namex8.numberx9.namex9.numberx10.namex10.number/前序递归遍
15、历The result of preorder recursive traversal:PreOrder(p1);endl /中序递归遍历coutThe result of inorder recursive traversal:InOrder(p1); /后序递归遍历The result of postorder recursive traversal:PostOrder(p1); /前序非递归遍历The result of pretorder non-recursive traversal:PreOrderN(p1);/中序非递归遍历The result of inorder non-re
16、cursive traversal:InOrderN(p1); /后序非递归遍历The result of postorder non-recursive traversal:PostOrderN(p1); /层次遍历从上至下、从左至右The result of level traversal from up to down from left to right:LevelOrderTL(p1); /层次遍历从上至下、从右至左The result of level traversal from up to down from right to left:LevelOrderTR(p1); /二
17、叉树高度The height of the Binarytree is:BinaryHeight(p1)next = NULL;int StackNotEmpty(LSNode *head)/*判堆栈是否非空,非空返回1;空返回0*/if(head-next = NULL) return 0;else return 1;int StackPush(LSNode *head, DataType x) /*把数据元素x插入链式堆栈head的栈顶作为新的栈顶 */LSNode *p;if(p = (LSNode *)malloc(sizeof(LSNode) = NULL)printf(内存空间不足无法插入! n);return 0;data = x;next = head-next;/*新结点链入栈顶*/head-next = p;/*新结点成为新的栈顶*/return 1;int StackPop(LSNode *head, DataType *d)/*出栈并把栈顶元素由参数d带回*/LSNode *p = head-if(p = NULL) 堆栈已空出错!next = p-/*删除原栈顶结点*/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1