注释写的很详细了,就直接上代码吧。
#include<iostream>
#include<string>
#include<stack>
#include<vector>
using namespace std;
struct Node
{
char data; //数据
int parent; //双亲指针
};
void createPTree_gen(vector<Node> &T,string G)
{
stack<int>stk; //栈顶存放当前要处理的子树双亲的下标
int k = -1; //k表示已经存放的最后一个结点的下标初始为 -1
char ch; //当前读入的字符G[i]
for(int i = 0; i < G.length(); i++)
{
ch = G[i];
switch(ch)
{
case '(': //进入一颗子树
stk.push(k); //把子树双亲下标存入栈
break;
case ')': //处理完一颗子树
stk.pop(); //把刚处理完的子树的双亲下标从栈顶弹出
break;
case ',': //子表内进行后续处理,跳过
break;
default: //读入的不是 '(' ')' ',' 而是结点
Node newNode; //临时的结点,用于存放新的结点的数据
newNode.data = ch; //存放结点data
if(stk.empty()) newNode.parent = -1; //只有第一个结点刚进才会栈空,其余结点不会
else
{ //不是第一个结点,它双亲的下标在栈顶
newNode.parent = stk.top();
}
T.push_back(newNode); //把新的结点加到树的后面
k++;
}
}
}
void printPTree(vector<Node>T)
{
stack<int>stk;
cout<<T[0].data; //特别处理第一个结点
stk.push(-1);
for(int i = 1; i < T.size(); i++)
{
if(!stk.empty())
{
if(T[i].parent > stk.top()) //进入子树
{
cout<<"(";
stk.push(T[i].parent);
}
else if(T[i].parent == stk.top()) //属于同一个子树
{
cout<<",";
}
else //返回上一层
{
cout<<"),";
stk.pop();
}
}
cout<<T[i].data;
}
cout<<")"<<endl; //特别处理最后一个结点
}
int main()
{
string G = "A(B(E(K,L),F),C(G),D(H(M),I,J))";
vector<Node>T;
createPTree_gen(T,G);
for(int i = 0; i < T.size(); i++)
{
cout<<"T["<<i<<"].data is "<<T[i].data<<" parent is :"<<T[i].parent<<endl;
}
printPTree(T);
}