北邮oj中序遍历树

下
本题并不是二叉树,应采用类似于图的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; 
}
 

猜你喜欢

转载自blog.csdn.net/weixin_37762592/article/details/88568130