题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 n。(1≤n≤26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用 * 表示
输出格式
二叉树的前序遍历。
输入输出样例
输入
6
abc
bdi
cj*
d**
i**
j**
输出
abdicj
这个题没啥特殊,就是新手熟悉基础用法
①
直接用搜索
#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstdio>
#include <string>
using namespace std;
struct node
{
char value,l,r;
}a[200];
void preorder(char root)
{
if(root)//必不可少
{
cout<<root;//输出当前节点
preorder(a[root].l);
preorder(a[root].r);
}
}
int main()
{
int n;
cin>>n;
string t;
cin>>t;
char root;
root=t[0];
if(t[1]!='*') a[t[0]].l=t[1];
if(t[2]!='*') a[t[0]].r=t[2];
for(int i=1;i<n;i++)
{
cin>>t;
if(t[1]!='*') a[t[0]].l=t[1];//节点的左孩子
if(t[2]!='*') a[t[0]].r=t[2];//节点的右孩子
}
preorder(root);
return 0;
}
②
传指针
大同小异,先看上面呢种方法更好理解一点
#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <cstdlib>
#include <string>
using namespace std;
struct node
{
char value;
node *l,*r ;
//node(int value = 0,node *l=NULL,node *r =NULL):value(value),l(l),r(r){}//构造函数
}a[200];
node *root;
void preorder(node *root)
{
if(root!=NULL)
{
cout<<root->value;//输出当前节点
preorder(root->l);
preorder(root->r);
}
}
int main()
{
for(int i=0;i<200;i++) a[i].value=i;//初始化
int n;
cin>>n;
char t[5];
cin>>t;
root=&a[t[0]];
if(t[1]!='*') a[t[0]].l=&a[t[1]];
if(t[2]!='*') a[t[0]].r=&a[t[2]];
for(int i=1;i<n;i++)
{
cin>>t;
if(t[1]!='*') a[t[0]].l=&a[t[1]];//节点的左孩子
if(t[2]!='*') a[t[0]].r=&a[t[2]];//节点的右孩子
}
preorder(root);
return 0;
}