题目大意:输入一颗无根树的括号序列,求这棵树的普吕弗序列。
分析思路:
1)普吕弗序列,可以参考维基百科,其做法是找出树中编号最小的叶子节点,并将此叶子节点及边删除,并输出其邻接的节点标号;
2)递归地构造树,可以使用list<int> 数组来表示一个“邻接表”,以存储构造的树;
3)使用优先队列来进行删除,奈何priority_queue没有迭代器访问,只能用堆排序,取最值;
代码:
#include<iostream> #include<vector> #include<map> #include<queue> #include<string> #include<algorithm> #include<fstream> #include<list> using namespace std; struct nodeAndDegree { int degree; //度 int nodeNumber; //结点编号 bool operator < (const nodeAndDegree& n1)const { return degree == n1.degree ? (nodeNumber > n1.nodeNumber) : (degree > n1.degree); } }; const int MAX_LEN = 55; list<int> vGraph[MAX_LEN]; vector<int> v; int rootNumber = 0; void dfs(int start, int end, int parent, string str) { if (start == end) //只有单个点 { return; } //放入邻接矩阵 int currentNode = 0; for (int i = start + 1; i <= end - 1; i++) { if (str[i] == ' ' || str[i] == '