题目描述
输入一串二叉树,用遍历前序打出。
输入输出格式
输入格式:
第一行为二叉树的节点数n。(n≤26)
后面n行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用*表示
输出格式:
前序排列的二叉树
输入输出样例
输入样例#1: 复制
6
abc
bdi
cj*
d**
i**
j**
输出样例#1: 复制
abdicj
看题解是根结点在第一行。如果不在第一行是会有一点点麻烦。
根结点在第一行的AC代码:
////CSDN博客:https://blog.csdn.net/qq_40889820
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
struct node
{
char ele;
node* lc;
node* rc;
node(char c)
{
ele=c;lc=rc=NULL;
}
};
node* root=NULL;
node* Find(char ch,node* n)
{
if(n==NULL) return NULL;
if(n->ele==ch) return n;
node* ans=Find(ch,n->lc);//先找左子树
if(ans) return ans;//找到了就返回
else return Find(ch,n->rc); //左子树没找到在右子树找
}
void add_2node(string str)
{
char c=str[0],l=str[1],r=str[2];
node* pos=Find(c,root);
node* lchild=new node(l);
node* rchild=new node(r);
pos->lc=lchild;
pos->rc=rchild;
return;
}
void preorder(node* n)
{
if(n->ele=='*'||n==NULL) return;
cout<<n->ele;
preorder(n->lc);
preorder(n->rc);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
string str;
cin>>str;
if(i==1) root=new node(str[0]);//题目中根结点在第一行
add_2node(str);
}
preorder(root);
}
根结点不在第一行(不知道A没AC代码):
////CSDN博客:https://blog.csdn.net/qq_40889820
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
struct node
{
char ele;
node* lc;
node* rc;
node(char c)
{
ele=c;lc=rc=NULL;
}
};
node* root=NULL;
node* Find(char ch,node* n)
{
if(n==NULL) return NULL;
if(n->ele==ch) return n;
node* ans=Find(ch,n->lc);//先找左子树
if(ans) return ans;//找到了就返回
else return Find(ch,n->rc); //左子树没找到在右子树找
}
void add_2node(string str)
{
char c=str[0],l=str[1],r=str[2];
node* pos=Find(c,root);
if(pos!=NULL)
{
pos->lc=new node(l);
pos->rc=new node(r);
}
//原先的根结点是新读入结点的左子结点
else if((pos=Find(l,root))!=NULL)
{
node* ne=new node(c);
ne->lc=root;
ne->rc=new node(r);
root=ne;
}
//原先的根结点是新读入结点的右子结点
else
{
node* ne=new node(c);
ne->rc=root;
ne->lc=new node(l);
root=ne;
}
return;
}
void preorder(node* n)
{
if(n->ele=='*'||n==NULL) return;
cout<<n->ele;
preorder(n->lc);
preorder(n->rc);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
string str;
cin>>str;
if(i==1) root=new node(str[0]);//先假定在第一行
add_2node(str);
}
preorder(root);
}