题目描述
输入一串二叉树,用遍历前序打出。
输入输出格式
输入格式:第一行为二叉树的节点数n。(n \leq 26n≤26 )
后面n行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用*表示
输出格式:
前序排列的二叉树
输入输出样例
解题思路:一开始准备用结构体表示树,内含双向指针,然后遇到了bug,首先是结构体运用不熟,没搞懂指针指向自定义类型的定义方法,然后就有父亲,儿子双向指针的繁琐,最后又在前序输出这个类似于dfs的输出方法没转过来怎么传送指针指向的内容,卒,,参看大佬题解,才明白思路一样代码也会差好多,1,以Int型代替char型,数组的下标一下子就简洁了,然后节点较简单,可以不用指针而直接存储,最后前序输出时也贼方便;
AC.1:(包含错误代码以示衬托)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct tree
{
int le,ri,fa;
}T[30];
int n,root;
string c;
void visit(int k)
{
char ch = k + 96; printf("%c",ch);
if(T[k].le!=0) visit(T[k].le);
if(T[k].ri!=0) visit(T[k].ri);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>c;
if(c[1]!='*')
{
T[c[0]-96].le = c[1]-96;
T[c[1]-96].fa = c[0]-96;
}
if(c[2]!='*')
{
T[c[0]-96].ri = c[2]-96;
T[c[2]-96].fa = c[0]-96;
}
}
for(int i=1;i<=26;i++)
if(T[i].fa==0)
{
root=i;
break;
}
visit(root);
return 0;
}
//#include<iostream>
//#include<cstdio>
//#include<cstring>
//using namespace std;
//struct Tree
//{
// char x;
// Tree* lson;
// Tree* rson;
//};
//Tree tree[1000];
//int main()
//{
// int t;
// cin>>t;
// char s[4],begain;
// for(int i=1;i<=t;i++)
// {
// cin>>s;
// if()
//// trees[s[0]].x=s[0];
//// if(trees[s[1]].fa!=NULL)//
//// trees[s[1]].fa=&trees[s[0]];
//// if(trees[s[2]].fa!=NULL)
//// trees[s[2]].fa=&trees[s[0]];
//// if(s[1]!='*')
//// trees[s[0]].lson=&trees[s[1]];
//// if(s[2]!='*')
//// trees[s[0]].rson=&trees[s[2]];
//// }
//// for(int i=97;i<=124;i++)
//// {
//// if(trees[i].x!='0')
//// begain=trees[i].x;
//// }
//// dfs(begain);
// return 0;
//}