- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
- Both the left and right subtrees must also be binary search trees.
Given the structure of a binary tree and a sequence of distinct integer keys, there is only one way to fill these keys into the tree so that the resulting tree satisfies the definition of a BST. You are supposed to output the level order traversal sequence of that tree. The sample is illustrated by Figure 1 and 2.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤\le≤100) which is the total number of nodes in the tree. The next N lines each contains the left and the right children of a node in the format left_index right_index
, provided that the nodes are numbered from 0 to N-1, and 0 is always the root. If one child is missing, then -1 will represent the NULL child pointer. Finally N distinct integer keys are given in the last line.
Output Specification:
For each test case, print in one line the level order traversal sequence of that tree. All the numbers must be separated by a space, with no extra space at the end of the line.
Sample Input:
9
1 6
2 3
-1 -1
-1 4
5 -1
-1 -1
7 -1
-1 8
-1 -1
73 45 11 58 82 25 67 38 42
Sample Output:
58 25 82 11 38 67 45 73 42
result:
#include<stdio.h>
#include<stdlib.h>
typedef struct TNode* Tree;
struct TNode
{
int Key;
int Node;
Tree Left;
Tree Right;
};
void inorder(Tree head,int* a);
void invisit(Tree head,int* a);
int anum=0;
int main (void)
{
int num;
int i,j;
int f,l;
int *a;
int *n;
int k;
int min;
int temp;
Tree* head;
Tree* level;
scanf("%d",&num);
head=(Tree*)calloc(sizeof(Tree*),(num));
level=(Tree*)calloc(sizeof(Tree*),(num));
for(i=0;i<num;i++)
{
head[i]=(Tree)malloc(sizeof(struct TNode));
head[i]->Left=NULL;
head[i]->Right=NULL;
head[i]->Key=i;
}
for(i=0;i<num;i++)
{
scanf("%d%d",&l,&f);
if(l!=-1)
head[i]->Left=head[l];
if(f!=-1)
head[i]->Right=head[f];
}
a=(int*)calloc(sizeof(int),(num));
inorder(head[0],a);
anum--;
n=(int*)calloc(sizeof(int),(num));
for(i=0;i<num;i++)
{
scanf("%d",&k);
n[i]=k;
}
for(j=0;j<num;j++)
{
min=j;
for(i=j;i<num;i++)
{
if(n[i]<n[min])
min=i;
}
temp=n[j];
n[j]=n[min];
n[min]=temp;
}
for(i=0;i<num;i++)
{
head[a[i]]->Node=n[i];
}
level[0]=head[0];
f=0;
l=1;
while(f!=l)
{
if(level[f]->Left!=NULL)
{
level[l]=level[f]->Left;
l++;
}
if(level[f]->Right!=NULL)
{
level[l]=level[f]->Right;
l++;
}
f++;
}
printf("%d",level[0]->Node);
for(i=1;i<num;i++)
{
printf(" %d",level[i]->Node);
}
return 0;
}
void inorder(Tree head,int* a)
{
if(head==NULL)
return ;
inorder(head->Left,a);
invisit(head,a);
inorder(head->Right,a);
}
void invisit(Tree head,int* a)
{
a[anum]=head->Key;
anum++;
}