题目传送器
题目意思: 给你一个有字母构成的二叉树,请输出它的先序序列。
1.首先,我们考虑输入部分:
我们先用结构体存储每一个点的信息:
struct node{ int father,lson,rson; node(){ father = -1; lson = -1; rson = -1; } }a[30];
由于我们的father,lson,rson以及下标都是int类型的,所以我们用char读入来赋值。
代码如下:
cin >> n; for(int i = 1; i <= n; i++) { char x, y; cin >> f[i] >> x >> y; if(x != '*') a[f[i] - 'a'].lson = x - 'a',a[a[f[i] - 'a'].lson].father = f[i] - 'a'; if(y != '*') a[f[i] - 'a'].rson = y - 'a',a[a[f[i] - 'a'].rson].father = f[i] - 'a'; }
2. 我们接下来考虑处理:
因为求的是先序(父 - 左 - 右),我们先找整棵树的根节点,既整棵树最大的子树的父节点:
for(int i = 1; i <= n; i++) if(a[f[i] - 'a'].father == -1){ t = f[i] - 'a'; break; }
由根节点向下找,知道找到叶子节点位置:
void dfs(int x) { if(x == -1) return ; cout << char(x + 'a'); dfs(a[x].lson); dfs(a[x].rson); }完结撒花!
完整代码偷偷地放在后面:
#includeusing namespace std; int n, t; struct node{ int father,lson,rson; node(){ father = -1; lson = -1; rson = -1; } }a[30]; void dfs(int x) { if(x == -1) return ; cout << char(x + 'a'); dfs(a[x].lson); dfs(a[x].rson); } char f[30]; int main() { cin >> n; for(int i = 1; i <= n; i++) { char x, y; cin >> f[i] >> x >> y; if(x != '*') a[f[i] - 'a'].lson = x - 'a',a[a[f[i] - 'a'].lson].father = f[i] - 'a'; if(y != '*') a[f[i] - 'a'].rson = y - 'a',a[a[f[i] - 'a'].rson].father = f[i] - 'a'; } for(int i = 1; i <= n; i++) if(a[f[i] - 'a'].father == -1){ t = f[i] - 'a'; break; } dfs(t); return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)