模拟建立一棵树,排序之后深度优先遍历打印输出即可
注意:含有string和vector的结构体不能malloc,会出bug,只能new


#include<iostream>
#include<vector>
#include<string>
#include<algorithm>

using namespace std;

struct Node{
	int n=0;
	string name;
	vector<Node*> children;
};
Node* appendNode(string name,Node *parent){
	Node* a = new Node();//不能用malloc 否则string和vector会出bug 
	a->n = 0;
	a->name = name;
	parent->n = parent->n+1;
	parent->children.push_back(a);
	return a;
}
Node* getChild(string name,Node parent){
	vector<Node*>::iterator it = parent.children.begin();
	while(it!=parent.children.end()){
		if((*it)->name==name) return *it;
		it++;
	}
	return NULL;
}
bool cmp(Node* a,Node* b){
	return a->name < b->name;
}
void DFS(Node* root,string spacing=""){
	sort(root->children.begin(),root->children.begin()+root->n,cmp);
	
	vector<Node*>::iterator child = root->children.begin();
	while(child!=root->children.end()){
		cout<<spacing<<(*child)->name<<endl;
		DFS(*child,spacing+"  ");
		
		child++;
	}
}
int main(){//习题2.10  上海交大  根据路径打印目录结构
	int n;
	while(cin>>n){
        if(n==0) break;
		Node root;
		
		string path;
		for(int k=0;k<n;k++){
			cin>>path;
			int i=0,j=0;
			int len=path.size();
			Node* current = &root;
			
			while(i<len && j< len){
				while(path[j]!='\\'&&j<len){
					j++;
				}
				string name = path.substr(i,j-i);
				
				Node* child = getChild(name,*current);
				if(child!=NULL){
					current = child;
				} else {
					current = appendNode(name,current);	
				}
				i=++j;
			}
		}
		//深度优先遍历,以打印目录
		DFS(&root);
        cout<<endl;
	} 
	return 0;
}