题目链接:
一道水题。
先定义一个变量n,存储节点数,然后定义一个变量tree_gen,存储树根位置,然后定义一个结构体,里面包含节点值以及数组里左右孩子的索引:
#include<bits/stdc++.h>
using namespace std;
int n,tree_gen; //节点数
struct tree{
char jie; //节点值
int zuo,you; //左右孩子索引
}a[256]; //数组
接下来写一个先序遍历函数,并满足根左右的遍历顺序:
void xian(int x){ //根左右
cout<<a[x].jie; //节点数
if(a[x].zuo!=0){ //左孩子不为空节点
xian(a[x].zuo);
}
if(a[x].you!=0){ //右孩子不为空节点
xian(a[x].you);
}
}
最后是主函数,先输入节点数,然后遍历输入,在循环内临时定义三个变量,分别存储根节点,左孩子和右孩子,然后找到根的位置,并将节点位置赋值,左右如果不是*号,也就不是空的,是空的就赋值为0,最后调用函数先序输出:
int main(){
cin>>n;
for(int i=1;i<=n;i++){
char ch,z,y;
cin>>ch>>z>>y;
a[int(ch)].jie=ch;
if(i==1){
tree_gen=int(ch);
}
if(z!='*'){
a[int(ch)].zuo=int(z);
}
else{
a[int(ch)].zuo=0;
}
if(y!='*'){
a[int(ch)].you=int(y);
}
else{
a[int(ch)].you=0;
}
}
xian(tree_gen);
return 0;
}
最后放一下整体代码:
#include<bits/stdc++.h>
using namespace std;
int n,tree_gen; //节点数
struct tree{
char jie; //节点值
int zuo,you; //左右孩子索引
}a[256]; //数组
void xian(int x){ //根左右
cout<<a[x].jie; //节点数
if(a[x].zuo!=0){ //左孩子不为空节点
xian(a[x].zuo);
}
if(a[x].you!=0){ //右孩子不为空节点
xian(a[x].you);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
char ch,z,y;
cin>>ch>>z>>y;
a[int(ch)].jie=ch;
if(i==1){
tree_gen=int(ch);
}
if(z!='*'){
a[int(ch)].zuo=int(z);
}
else{
a[int(ch)].zuo=0;
}
if(y!='*'){
a[int(ch)].you=int(y);
}
else{
a[int(ch)].you=0;
}
}
xian(tree_gen);
return 0;
}
本人是第二次法题解,题解可能不是最优解,请莫要怪罪哈~