///如有BUG,联系:dabbysunshine@qq.com #include <stdio.h> #include <stdlib.h> typedef struct node { int Data; struct node *LeftChild,*RightChild; } Tnode; void In_Pre_CreateBiTree(int *In,int *Pre,int InPre,int InPost, int PrePre,int PrePost,Tnode **BiTree); void PostOrderTraverse(Tnode *BiTree); void CreateArray(int *Array,int Length); void LevelOrderTraverse(Tnode *BiTree); #define MAXQSIZE 100 #define OK 1 #define ERROR 0 typedef struct { Tnode **base; int front; int rear; } SqQueue; int InitQueue(SqQueue &Q);//构造一个空栈 bool QueueEmpty(SqQueue Q);//判断是否是空对列 bool EnQueue(SqQueue &Q,Tnode *BiTree);//插入新的队尾元素 bool DeQueue(SqQueue &Q,Tnode *&BiTree);//删除队头元素 void DestoryQueue(SqQueue &Q);//摧毁构造的队列 void visit(Tnode *&BiTree); //输出 int LeveOrderTraverse(Tnode *&BiTree, void(*visit)(Tnode *&BiTree));//层序遍历 /*主函数部分*/ int main() { int *In,*Pre; Tnode *BiTree; int Length; scanf("%d",&Length); In = (int*)malloc(Length*sizeof(int)); Pre = (int*)malloc(Length*sizeof(int)); CreateArray(Pre,Length); CreateArray(In,Length); In_Pre_CreateBiTree(In,Pre,0,Length-1,0,Length-1,&BiTree); LeveOrderTraverse(BiTree,visit); puts(""); PostOrderTraverse(BiTree); puts(""); free(In); free(Pre); return 0; } void CreateArray(int *Array,int Length) { int i = 0; for(; i < Length; i++) { scanf("%d",&Array[i]); } } void In_Pre_CreateBiTree(int *In,int *Pre,int InPre, int InPost,int PrePre,int PrePost,Tnode **BiTree) { int i; if(InPre > InPost || PrePre > PrePost) { *BiTree = NULL; } else { *BiTree = (Tnode*)malloc(sizeof(Tnode)); (*BiTree)->Data = Pre[PrePre]; for(i = InPre; i <= InPost; i++) { if(In[i] == Pre[PrePre]) { In_Pre_CreateBiTree(In,Pre,InPre,i-1,PrePre+1, PrePost+i-InPre,&(*BiTree)->LeftChild); In_Pre_CreateBiTree(In,Pre,i+1,InPost,PrePre+i-InPre+1, PrePost,&(*BiTree)->RightChild); break; } if(i > InPost) { printf("ERROR!/n"); exit(0); } } } } void PostOrderTraverse(Tnode *BiTree) { if(BiTree) { PostOrderTraverse(BiTree->LeftChild); PostOrderTraverse(BiTree->RightChild); printf("%d ",BiTree->Data); } } ///队列的自定义函数 int InitQueue(SqQueue &Q) { //构造一个空栈 Q.base = (Tnode **)malloc(MAXQSIZE*sizeof(Tnode*)); if(!Q.base) { puts("内存分配失败."); exit(ERROR); } Q.front = Q.rear = 0; return OK; } bool QueueEmpty(SqQueue Q) { //判断是否是空对列 if(Q.rear == Q.front) { return false; } else { return true; } } bool EnQueue(SqQueue &Q,Tnode *BiTree) { //插入新的队尾元素 if((Q.rear + 1)%MAXQSIZE == Q.front) { printf("队列已满./n"); return false; } else { Q.base[Q.rear] = BiTree; Q.rear = (Q.rear + 1)%MAXQSIZE; return true; } } bool DeQueue(SqQueue &Q,Tnode *&BiTree) { //删除队头元素 if(Q.rear == Q.front) { puts("队列为空."); return false; } else { BiTree = Q.base[Q.front]; Q.front = (Q.front + 1)%MAXQSIZE; return true; } } void DestoryQueue(SqQueue &Q) { //摧毁构造的队列 free(Q.base); Q.base = NULL; Q.rear = Q.front = 0; } void visit(Tnode *&BiTree) //输出 { printf("%d ",BiTree->Data); } ///层序遍历. int LeveOrderTraverse(Tnode *&BiTree, void(*visit)(Tnode *&BiTree)) { //层序遍历输出树的各个结点 SqQueue Q; Tnode *p; if(BiTree) { InitQueue(Q); EnQueue(Q,BiTree); while(QueueEmpty(Q)) { DeQueue(Q,p); visit(p); if(p->LeftChild != NULL) { EnQueue(Q,p->LeftChild); } if(p->RightChild != NULL) { EnQueue(Q,p->RightChild); } } } DestoryQueue(Q); return OK; }