题目描述
给你一棵二叉树,求出它的遍历
输入
输入第一行为该树中结点的个数n,第二行到第n+1行分别为这n个结点的值(也代表序号),左子树和右子树
如:
5
1 2 3
2 4 5
3 0 0
4 0 0
5 0 0
表示
思路
运用很水的搜索找每一个点,因为根节点不确定,但只要找到了总节点数就肯定是解
先序
#include
#include
using namespace std;
int a[1000][4];
int f[1000];
int n,m,x,xx,fl;
int dfs(int dep,int x)
{
int l,r,k=0;
for (int i=1;i<=n;i++)
if (a[i][1]==x)
{
k=i;
break;
}
l=a[k][2]; r=a[k][3];
if (xx==n)
{
fl=1;
return 0;
}
for (int i=1;i<=n;i++)
if (i==a[k][2])
{
f[xx+1]=a[k][2];
xx++;
dfs(dep+1,a[k][2]);
}
for (int i=1;i<=n;i++)
if (i==a[k][3])
{
f[xx+1]=a[k][3];
xx++;
dfs(dep+1,a[k][3]);
}
return 0;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][3]);
}
for (int i=1;i<=n;i++)
{
memset(f,0,sizeof(f));
xx=1;
f[1]=a[i][1];
dfs(1,a[i][1]);
if (fl==1) break;
}
for (int i=1;i<=n;i++)
printf("%d\n",f[i]);
return 0;
}
中序
#include
#include
using namespace std;
int a[1000][4];
int f[1000];
int n,m,x,xx,fl;
int dfs(int dep,int x)
{
int l,r,k=0;
for (int i=1;i<=n;i++)
if (a[i][1]==x)
{
k=i;
break;
}
l=a[k][2]; r=a[k][3];
if (xx>=n)
{
fl=1;
return 0;
}
for (int i=1;i<=n;i++)
if (i==a[k][2])
{
dfs(dep+1,a[k][2]);
}
f[xx+1]=a[k][1];
xx++;
for (int i=1;i<=n;i++)
if (i==a[k][3])
{
dfs(dep+1,a[k][3]);
}
return 0;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][3]);
}
for (int i=1;i<=n;i++)
{
memset(f,0,sizeof(f));
xx=0;
dfs(1,a[i][1]);
if (xx==n) fl=1;
if (fl==1) break;
}
for (int i=1;i<=n;i++)
printf("%d\n",f[i]);
return 0;
}
后序
#include
#include
using namespace std;
int a[1000][4];
int f[1000];
int n,m,x,xx,fl;
int dfs(int dep,int x)
{
int l,r,k=0;
for (int i=1;i<=n;i++)
if (a[i][1]==x)
{
k=i;
break;
}
l=a[k][2]; r=a[k][3];
if (xx>=n)
{
fl=1;
return 0;
}
for (int i=1;i<=n;i++)
if (i==a[k][2])
{
dfs(dep+1,a[k][2]);
}
for (int i=1;i<=n;i++)
if (i==a[k][3])
{
dfs(dep+1,a[k][3]);
}
f[xx+1]=a[k][1];
xx++;
return 0;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][3]);
}
for (int i=1;i<=n;i++)
{
memset(f,0,sizeof(f));
xx=0;
dfs(1,a[i][1]);
if (xx==n) fl=1;
if (fl==1) break;
}
for (int i=1;i<=n;i++)
printf("%d\n",f[i]);
return 0;
}
Comments NOTHING