69,336
社区成员
发帖
与我相关
我的任务
分享
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int t[1000000 + 1] = {};
int que[1000000 + 1] = {};
int main (){
int n;
int i;
scanf ( "%d", &n );
for ( i = 1; i <= n - 1; i ++ ){
scanf ( "%d", &t[i] );
}
int s;//start of que
int e;//end of que
int cnt;
int tmp;
int done;
s = 0;
e = 0;
cnt = n;
que[e++] = 0;
while ( s != e ){
/*pop*/
tmp = que[s++];
/*push*/
done = 0;
for ( i = 1; i <= n - 1; i ++ ){
if ( t[i] == tmp ){
que[e++] = i;
done ++;
if ( done == 2 ){
break;
}
}
}
printf ( "%d", tmp );
cnt --;
if ( cnt != 0 ){
printf ( " " );
}
}
printf ( "\n" );
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int t[30000 + 1] = {};
int pos[30000 + 1] = {};
int stack[30000 + 1] = {};
int visit[30000 + 1] = {};
//int pos ( int x );
//void post ( int i );
int cnt;
int main (){
int n;
int i;
int i1;
int i2;
int i3;
int base;
int sonid;
t[1] = 1;
pos[1] = 1;
scanf ( "%d", &n );
for ( i = 1; i <= n; i ++ ){
scanf ( "%d%d%d", &i1, &i2, &i3 );
base = pos [i1];
if ( i2 != -1 ){
sonid = 2 * base;
t[sonid] = i2;
pos[i2] = sonid;
}
if ( i3 != -1 ){
sonid = 2 * base + 1;
t[sonid] = i3;
pos[i3] = sonid;
}
}
for ( i = 1; i <= n; i ++ ){
printf ( "%d", pos[i] );
if ( i != n ){
printf ( " " );
}
}
printf ( "\n" );
cnt = n;
int sp;//stack pointer
int p;
sp = 0;//begin with 1 in stack
p = 1;
/*go to the leftest one*/
while ( t[p] != 0 ){
sp ++;
stack[sp] = p;
p = 2 * p;//left child
}
while ( sp != 0 ){
p = stack[sp];
if ( t[2 * p + 1] == 0 || visit[p] == 1 ){//no right child or the second time p shows on the top of stack
visit[p] = 1;
sp --;
printf ( "%d", t[p] );
cnt --;
if ( cnt != 0 ){
printf ( " " );
}
else {
printf ( "\n" );
}
}
else {//from the right child, go to the leftest
visit[p] = 1;
p = 2 * p + 1;
while ( t[p] != 0 ){
sp ++;
stack[sp] = p;
p = p * 2;
}
}
}
return 0;
}
#include<iostream>
using namespace std;
#include<cstdio>
#define N 100000
int order[N]; //存储二叉树
int map[N]; //一个映射
int times = 1;
int n;
int postOrder(int head)
{
if (order[head * 2] != -1) postOrder(head * 2);
if (order[head * 2 + 1] != -1) postOrder(head * 2 + 1);
if (times == n)
printf("%d\n", order[head]);
else printf("%d ", order[head]);
times++;
return 0;
}
int main()
{
//freopen("E:/in.txt", "r", stdin);
scanf("%d", &n);
int num, left, right, temp;
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &num, &left, &right);
if (num == 1)
{
order[1] = 1;
map[1] = 1;
}
temp = map[num];
if (left != -1)
{
order[2 * temp] = left;
map[left] = 2 * temp;
}
else order[2 * temp] = -1;
if (right != -1)
{
order[2 * temp + 1] = right;
map[right] = 2 * temp + 1;
}
else order[2 * temp + 1] = -1;
}
for (int i = 1; i < n; i++)
printf("%d ", map[i]);
printf("%d\n", map[n]);
postOrder(1);
// fclose(stdin);
return 0;
}
[/quote]
#include<iostream>
using namespace std;
#include<cstdio>
#define N 100000
int order[N]; //存储二叉树
int map[N]; //一个映射
int times = 1;
int n;
int postOrder(int head)
{
if (order[head * 2] != -1) postOrder(head * 2);
if (order[head * 2 + 1] != -1) postOrder(head * 2 + 1);
if (times == n)
printf("%d\n", order[head]);
else printf("%d ", order[head]);
times++;
return 0;
}
int main()
{
//freopen("E:/in.txt", "r", stdin);
scanf("%d", &n);
int num, left, right, temp;
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &num, &left, &right);
if (num == 1)
{
order[1] = 1;
map[1] = 1;
}
temp = map[num];
if (left != -1)
{
order[2 * temp] = left;
map[left] = 2 * temp;
}
else order[2 * temp] = -1;
if (right != -1)
{
order[2 * temp + 1] = right;
map[right] = 2 * temp + 1;
}
else order[2 * temp + 1] = -1;
}
for (int i = 1; i < n; i++)
printf("%d ", map[i]);
printf("%d\n", map[n]);
postOrder(1);
// fclose(stdin);
return 0;
}
[/quote]
我把你的代码交上去,9个run time error,一个超时....哪里ac了....
我之前跟你写的差不多,递归写的,超时两个点,就改成非递归了,还超时两个点.....
#include<iostream>
using namespace std;
#include<cstdio>
#define N 100000
int order[N]; //存储二叉树
int map[N]; //一个映射
int times = 1;
int n;
int postOrder(int head)
{
if (order[head * 2] != -1) postOrder(head * 2);
if (order[head * 2 + 1] != -1) postOrder(head * 2 + 1);
if (times == n)
printf("%d\n", order[head]);
else printf("%d ", order[head]);
times++;
return 0;
}
int main()
{
//freopen("E:/in.txt", "r", stdin);
scanf("%d", &n);
int num, left, right, temp;
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &num, &left, &right);
if (num == 1)
{
order[1] = 1;
map[1] = 1;
}
temp = map[num];
if (left != -1)
{
order[2 * temp] = left;
map[left] = 2 * temp;
}
else order[2 * temp] = -1;
if (right != -1)
{
order[2 * temp + 1] = right;
map[right] = 2 * temp + 1;
}
else order[2 * temp + 1] = -1;
}
for (int i = 1; i < n; i++)
printf("%d ", map[i]);
printf("%d\n", map[n]);
postOrder(1);
// fclose(stdin);
return 0;
}