本题并不是二叉树,应采用类似于图的DFS遍历算法。
开始我想的使用vector,但没写出来,看到别人的方法也不太懂
最后用的这位大神的方法添加链接描述
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
char str[maxn];//输入字符串
int edge[maxn][maxn] = {0};//邻接矩阵
bool visited[maxn] = {0};//标记数组
string result,temp;//*****result存的是最后的答案,temp是每次从一个节点dfs遍历得到的字符串,如果小于result,就代替它
void dfs(int pos,int n){
int size = 0;
int son[n];//与节点想连的节点下标
visited[pos] = true;//标记
for(int i=0;i<n;i++){
if(i==pos) continue;
if(edge[pos][i]==1&&visited[i]==false) son[size++] = i; //将未被访问的节点存入son数组
}
if(size>0){//size>0,节点与其它未被标记的节点相连,递归
dfs(son[0],n);
temp = temp+str[pos];//左子树加入后,加入节点字符
for(int j=1;j<size;j++){
dfs(son[j],n);//相当于遍历右子树
}
}
else if(size==0){//递归到底,可以看作是到了树的左子树的尽头
temp = temp+str[pos];//加入字符串
}
}
int main(){
int n,u,v;
while(scanf("%d",&n)!=EOF){
scanf("%s",str);
for(int i=0;i<maxn;i++){
for(int j=0;j<maxn;j++){
edge[i][j] = 0; //初始化邻接矩阵
}
}
for(int i=1;i<n;i++){//****更新邻接矩阵
scanf("%d %d",&u,&v);
edge[u][v] = 1;
edge[v][u] = 1;
}
result = "";//result和temp初始都为空
temp = "";
for(int i=0;i<n;i++){ //********!!!!
memset(visited,0,sizeof(visited));//从每个节点dfs的时候都不要忘了初始化visited数组。我就犯了这个问题
dfs(i,n);
if(i==0) result = temp;
else if(result>temp){
result = temp;
}
temp = "";
}
cout<<result<<endl;
}
return 0;
}