标题: | 由顺序方式存储的完全二叉树进行重建 |
时 限: | 1000 ms |
内存限制: | 3000 K |
总时限: | 3000 ms |
描述: | 按顺序方式存储的一棵完全二叉树的结点记录,结点个数为n。根据所输入的顺序结构的结点记录建立二叉树,输出树的先序,中序和后序遍历结果。 注:数字“0”表示不存在此结点,没有孩子结点 |
输入: | 树结点个数n 顺序方式存储的完全二叉树 |
输出: | 先序遍历输出 中序遍历输出 后序遍历输出 |
输入样例: | 10 1 2 0 3 4 0 0 5 6 7 |
输出样例: |
1 2 3 5 6 4 7
5 3 6 2 7 4 1
5 6 3 7 4 2 1
|
//使用递归实现
#include <stdio.h>
#include <stdlib.h>
typedef struct _TreeNode
{
int key;
struct _TreeNode *LC;
struct _TreeNode *RC;
}TreeNode;
void CreatFromSqList(TreeNode* &node,int *array,int i,int n)
{
if(n<=0) exit(0);
if(i>n) exit(0);
if(array[i]!=0)
{
node=(TreeNode*)malloc(sizeof(TreeNode));
node->key=array[i];
node->LC=NULL;node->RC=NULL;
if(2*i<=n)
CreatFromSqList(node->LC,array,2*i,n);
if((2*i+1)<=n)
CreatFromSqList(node->RC,array,2*i+1,n);
}
return;
}
int RepreOrder(TreeNode *T)
{
if(T)
{
printf("%d ",T->key);
RepreOrder(T->LC);
RepreOrder(T->RC);
}
return 0;
}
int ReInOrder(TreeNode *T)
{
if(T)
{
ReInOrder(T->LC);
printf("%d ",T->key);
ReInOrder(T->RC);
}
return 0;
}
int RePostOrder(TreeNode *T)
{
if(T)
{
RePostOrder(T->LC);
RePostOrder(T->RC);
printf("%d ",T->key);
}
return 0;
}
int main()
{
int n,*array;
scanf("%d",&n);
array=(int*)malloc(sizeof(int)*(n+1));
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&array[i]);
}
TreeNode *root=NULL;
CreatFromSqList(root,array,1,n);
RepreOrder(root);
printf("\n");
ReInOrder(root);
printf("\n");
RePostOrder(root);
printf("\n");
return 0;
}