题目描述
给你一棵二叉树,求出它的遍历
输入
输入第一行为该树中结点的个数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