描述
给定一棵有n(n≤1000)个元素的完全二叉树,分别对其进行先序、中序和后序遍历,输出对应的遍历序列。
例如给定完全二叉树:1 2 3 4 5 6
先序序列:1 2 4 5 3 6
中序序列:4 2 5 1 6 3
后序序列:4 5 2 6 3 1
格式
输入格式
第一行一个整数n,表示这棵完全二叉树的元素数目;第二行是n个整数,分别表示这棵二叉树上的元素值。
输出格式
输出为三行,第一行是先序遍历序列,第二行是中序遍历序列,第三行是后序遍历序列。数值之间用空格分隔
样例
输入样例
8
246 53 520 879 865 388 745 477
输出样例
246 53 879 477 865 520 388 745
477 879 53 865 246 388 520 745
477 879 865 53 388 745 520 246
限制
时间限制:300 ms
内存限制:16384 KB
代码
#include<stdio.h>#include<stdlib.h>typedef struct bitree{int data;struct bitree *lchild,*rchild;} BiTNode;BiTNode* CreateBiTree(int *,int);void PreOderTraverse(BiTNode *);void PreOderTraverse_hou(BiTNode *);void PreOderTraverse_zhong(BiTNode *);int main(){BiTNode *t;int n,i;scanf("%d",&n);int a[1001];for(i=0; i<n; i++){scanf("%d",&a[i]);}//int a[10] = {1,2,3,4,5,6,7,8,9}; //树中结点的数据t = CreateBiTree(a,n);PreOderTraverse(t);printf("\n");PreOderTraverse_zhong(t);printf("\n");PreOderTraverse_hou(t);return 0;}//创建二叉树BiTNode* CreateBiTree(int *a,int n){BiTNode *root,*p;BiTNode *bitQueue[n]; //定义一个队列用来存放完全二叉树int front=1,rear=1; //初始化队列//生成结点并入队int i;for(i=0; i<n; i++){if(*(a+i) == 0)p = NULL;else{p = (BiTNode *)malloc(sizeof(BiTNode));p->data = *(a+i);p->lchild = p->rchild = NULL;}bitQueue[rear++] = p; //p结点入队,队尾指针加 1if(i==0) root = p; //初始化根节点}//找出结点间的父子关系while(front != rear) //如果队列不为空{p = bitQueue[front]; //当前要找关系的结点if(p != NULL){if(2*front <= n) p->lchild = bitQueue[2*front];if(2*front+1 <= n) p->rchild = bitQueue[2*front+1];}front++; //队头指针加 1,指向下一个结点}return root;}//前序遍历void PreOderTraverse(BiTNode *t){if(t) //如果树不为空{printf("%d ",t->data);PreOderTraverse(t->lchild);PreOderTraverse(t->rchild);}}//中序遍历void PreOderTraverse_zhong(BiTNode *t){if(t) //如果树不为空{PreOderTraverse_zhong(t->lchild);printf("%d ",t->data);PreOderTraverse_zhong(t->rchild);}}//后序遍历void PreOderTraverse_hou(BiTNode *t){if(t) //如果树不为空{PreOderTraverse_hou(t->lchild);PreOderTraverse_hou(t->rchild);printf("%d ",t->data);}}
