您的位置:首页 > 其它

HDOJ 题目3999 The order of a Tree(二叉树)

2014-12-11 10:39 330 查看

The order of a Tree

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1175    Accepted Submission(s): 605


[align=left]Problem Description[/align]
As we know,the shape of a binary search tree is greatly related to the order of keys we insert. To be precisely:

1.  insert a key k to a empty tree, then the tree become a tree with

only one node;

2.  insert a key k to a nonempty tree, if k is less than the root ,insert

it to the left sub-tree;else insert k to the right sub-tree.

We call the order of keys we insert “the order of a tree”,your task is,given a oder of a tree, find the order of a tree with the least lexicographic order that generate the same tree.Two trees are the same if and only if they have the same shape.

 

[align=left]Input[/align]
There are multiple test cases in an input file. The first line of each testcase is an integer n(n <= 100,000),represent the number of nodes.The second line has n intergers,k1 to kn,represent the order of a tree.To make if more simple,
k1 to kn is a sequence of 1 to n.

 

[align=left]Output[/align]
One line with n intergers, which are the order of a tree that generate the same tree with the least lexicographic.

 

[align=left]Sample Input[/align]

4

1 3 4 2

 

[align=left]Sample Output[/align]

1 3 2 4

 

[align=left]Source[/align]
2011 Multi-University Training Contest 16 - Host by TJU

 

[align=left]Recommend[/align]
lcy   |   We have carefully selected several similar problems for you:  4000 1710 3627 3998 3996 
 ac代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct s
{
int data;
struct s *l,*r;
}tree;
void build(tree * &root,int num)
{
if(root==NULL)
{
root=(tree *)malloc(sizeof(tree));
root->data=num;
root->l=NULL;
root->r=NULL;
}
else
{
if(num<root->data)
build(root->l,num);
else
build(root->r,num);
}
}
void print(tree *root,int w)
{
if(root==NULL)
return;
if(w==2)
printf(" ");
printf("%d",root->data);
print(root->l,2);
print(root->r,2);
}
int main()
{
int n;;
while(scanf("%d",&n)!=EOF)
{
int i,num;
tree *root=NULL;
for(i=0;i<n;i++)
{
scanf("%d",&num);
build(root,num);
}
print(root,1);
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: