P1305 新二叉树

https://www.luogu.com.cn/problem/P1305

本题按照自己理解,如果N个字符串是乱序输入的话,需要先找根再从根先序遍历,便有如下代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 string s;
 5 struct node{
 6     char lch, rch;
 7 };
 8 node t[26];//存放树节点下标对应26个字母为  c-'a'; 
 9 int f[30];//标记父亲,用于查找根节点 
10 int root;//用于查找根下标 ,本题比较水的原因在于根节点在第一个字符 
11 void qxbl(int r){//前序遍历 
12     cout<<char(r+'a');//输出根数据 
13     if(t[r].lch!='*')
14         qxbl(t[r].lch-'a');//递归左左子 
15     if(t[r].rch!='*')
16         qxbl(t[r].rch-'a');//递归右儿子 
17 }
18 int main()
19 {    
20     memset(f, -1, sizeof(f)); //初始化所有节点的父亲为-1 
21     cin>>n;
22     for(int i=0; i<n; i++){
23         cin>>s;
24         //if(i==0)root=s[i]-'a';
25         t[s[0]-'a'].lch=s[1];
26         t[s[0]-'a'].rch=s[2];
27         if(s[1]!='*')//标记父亲节点 
28             f[s[1]-'a']=s[0]-'a';
29         if(s[2]!='*')//标记父亲节点 
30             f[s[2]-'a']=s[0]-'a';
31     }
32     for(int i=0; i<26; i++){//找根节点,没有父亲的节点为根节点 
33         if(f[i]==-1){
34             root=i;
35             break;
36         } 
37     }
38     qxbl(root); 
39     return 0;
40  } 

但经过测试,数据很水,第一字符串中第一个字符即为根节点,所以对上述代码删除精简如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 string s;
 5 struct node{
 6     char lch, rch;
 7 };
 8 node t[26];//存放树节点下标对应26个字母为  c-'a'; 
 9 int root;//用于查找根下标 ,本题比较水的原因在于根节点在第一个字符 
10 void qxbl(int r){//前序遍历 
11     cout<<char(r+'a');//输出根数据 
12     if(t[r].lch!='*')
13         qxbl(t[r].lch-'a');//递归左左子 
14     if(t[r].rch!='*')
15         qxbl(t[r].rch-'a');//递归右儿子 
16 }
17 int main()
18 {    
19     cin>>n;
20     for(int i=0; i<n; i++){
21         cin>>s;
22         if(i==0)root=s[i]-'a';
23         t[s[0]-'a'].lch=s[1];
24         t[s[0]-'a'].rch=s[2];
25     }
26 
27     qxbl(root); 
28     return 0;
29  } 

 

posted @ 2021-01-02 16:41  TFLSNOI  阅读(143)  评论(0编辑  收藏  举报