题目
根据树的层号表示建树,打印树的后序遍历序列。
A
/ \
B C
/ \
D E
可以表示为(0,A) (1,B) (2,D) (2,E) (1,C)
。
思路
- 为了依照输入唯一确定一棵树,struct中还需要加入
parent
和child
属性 - 可以利用
cin
对输入进行简化处理 - 如果仅使用
pcNode
而不使用levelNode
,在构建树的过程中,例如在定义pcNode* root
时,需要将a[0]
中的信息拷贝进root
,而child
为一个数组,如果使用手动拷贝,则操作较为繁琐;如果定义拷贝构造函数,则拷贝构造函数将覆盖默认构造函数,导致无法声明形如pcNode a[]
的数组,所以加用一个levelNode
用于存储输入的层号和数据
代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 30
int n;
struct levelNode
{
int lev;
char data;
};
struct pcNode
{
int lev;
char data;
pcNode* child[MAXN];
pcNode* parent;
pcNode(levelNode a)
{
lev = a.lev;
data = a.data;
for (int i = 0; i < MAXN; i++)
child[i] = NULL;
parent = NULL;
}
};
levelNode a[MAXN];
void getData()
{
cin >> n;
char c;
for (int i = 0; i < n; i++)
{
cin >> c >> a[i].lev >> c >> a[i].data >> c;
getchar();
}
}
pcNode* buildTree(levelNode* a, int n)
{
pcNode* root = new pcNode(a[0]);
pcNode* p = root;
for (int i = 1; i < n; i++)
{
pcNode* q = new pcNode(a[i]);
while (p->lev >= q->lev) // 找到q的parent
{
p = p->parent;
}
int j = 0;
while (p->child[j] != NULL) j++;
p->child[j] = q;
q->parent = p;
p = q;
}
return root;
}
void postOrderTraverse(pcNode* root)
{
if (root)
{
for (int i = 0; i < MAXN; i++)
{
if (root->child[i])
postOrderTraverse(root->child[i]);
}
cout << root->data;
}
}
int main()
{
getData();
pcNode* root = buildTree(a, n);
postOrderTraverse(root);
return 0;
}