題目描述
輸入一串二叉樹,用遍歷前序打出。
輸入輸出格式
輸入格式:
?
第一行為二叉樹的節點數n。(n \leq 26n≤26)
后面n行,每一個字母為節點,后兩個字母分別為其左右兒子。
空節點用*表示
?
輸出格式:
?
前序排列的二叉樹
?
輸入輸出樣例
輸入樣例#1: 復制
6
abc
bdi
cj*
d**
i**
j**
輸出樣例#1: 復制
abdicj
#include<bits/stdc++.h> using namespace std;struct Node{char lch = '*';//左孩子 默認為* 表示沒有char rch = '*';//右邊的孩子 }; bool vis[26];//判斷有沒有出現過 遍歷的時候直接用了 bool isNotRoot[26];//判斷是不是根如果出現了還是false那么就根 Node tree[29];//樹 void build(char root,char left,char right){vis[root-'a']=true;if(left !='*'){tree[root-'a'].lch = left; isNotRoot[left-'a'] = true;//肯定不是根了 vis[left-'a'] = true;} if(right !='*'){tree[root-'a'].rch = right;isNotRoot[right-'a'] = true;//肯定不是根了 vis[right-'a'] = true;//出現過了 } } void pre(char root){//前序遍歷 if(root=='*'){return;//如果是空的直接返回 }printf("%c",root);pre(tree[root-'a'].lch);pre(tree[root-'a'].rch);} int main(){int n = 0;scanf("%d",&n);for(int i = 0;i < n;i++){char num[4];scanf("%s",num);build(num[0],num[1],num[2]);//變成一二叉樹了 } for(int i = 0;i<26;i++){//找到樹根 if(vis[i]==true && isNotRoot[i]==false){pre(i+'a');break; }} printf("\n");return 0; }
?