描述

给定一棵有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


代码

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct bitree
  4. {
  5. int data;
  6. struct bitree *lchild,*rchild;
  7. } BiTNode;
  8. BiTNode* CreateBiTree(int *,int);
  9. void PreOderTraverse(BiTNode *);
  10. void PreOderTraverse_hou(BiTNode *);
  11. void PreOderTraverse_zhong(BiTNode *);
  12. int main()
  13. {
  14. BiTNode *t;
  15. int n,i;
  16. scanf("%d",&n);
  17. int a[1001];
  18. for(i=0; i<n; i++)
  19. {
  20. scanf("%d",&a[i]);
  21. }
  22. //int a[10] = {1,2,3,4,5,6,7,8,9}; //树中结点的数据
  23. t = CreateBiTree(a,n);
  24. PreOderTraverse(t);
  25. printf("\n");
  26. PreOderTraverse_zhong(t);
  27. printf("\n");
  28. PreOderTraverse_hou(t);
  29. return 0;
  30. }
  31. //创建二叉树
  32. BiTNode* CreateBiTree(int *a,int n)
  33. {
  34. BiTNode *root,*p;
  35. BiTNode *bitQueue[n]; //定义一个队列用来存放完全二叉树
  36. int front=1,rear=1; //初始化队列
  37. //生成结点并入队
  38. int i;
  39. for(i=0; i<n; i++)
  40. {
  41. if(*(a+i) == 0)
  42. p = NULL;
  43. else
  44. {
  45. p = (BiTNode *)malloc(sizeof(BiTNode));
  46. p->data = *(a+i);
  47. p->lchild = p->rchild = NULL;
  48. }
  49. bitQueue[rear++] = p; //p结点入队,队尾指针加 1
  50. if(i==0) root = p; //初始化根节点
  51. }
  52. //找出结点间的父子关系
  53. while(front != rear) //如果队列不为空
  54. {
  55. p = bitQueue[front]; //当前要找关系的结点
  56. if(p != NULL)
  57. {
  58. if(2*front <= n) p->lchild = bitQueue[2*front];
  59. if(2*front+1 <= n) p->rchild = bitQueue[2*front+1];
  60. }
  61. front++; //队头指针加 1,指向下一个结点
  62. }
  63. return root;
  64. }
  65. //前序遍历
  66. void PreOderTraverse(BiTNode *t)
  67. {
  68. if(t) //如果树不为空
  69. {
  70. printf("%d ",t->data);
  71. PreOderTraverse(t->lchild);
  72. PreOderTraverse(t->rchild);
  73. }
  74. }
  75. //中序遍历
  76. void PreOderTraverse_zhong(BiTNode *t)
  77. {
  78. if(t) //如果树不为空
  79. {
  80. PreOderTraverse_zhong(t->lchild);
  81. printf("%d ",t->data);
  82. PreOderTraverse_zhong(t->rchild);
  83. }
  84. }
  85. //后序遍历
  86. void PreOderTraverse_hou(BiTNode *t)
  87. {
  88. if(t) //如果树不为空
  89. {
  90. PreOderTraverse_hou(t->lchild);
  91. PreOderTraverse_hou(t->rchild);
  92. printf("%d ",t->data);
  93. }
  94. }