题目意思: 给你一个有字母构成的二叉树,请输出它的先序序列。
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);
}
完结撒花!
完整代码偷偷地放在后面:
#include<bits/stdc++.h>
using 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;
}