【洛谷】P1305 新二叉树

题目链接

题目描述

输入一串二叉树,用遍历前序打出。

输入输出格式

输入格式:

第一行为二叉树的节点数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);
}

猜你喜欢

转载自blog.csdn.net/qq_40889820/article/details/82634596