题目
根据树的层号表示建树,打印树的后序遍历序列。
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;
}
本文介绍如何根据树的层次表示构建树结构,并实现后序遍历,提供了代码示例。通过levelNode和pcNode结构,简化了输入处理,重点在于递归实现后序遍历算法。
653

被折叠的 条评论
为什么被折叠?



