题目描述:
有若干个节点,每个节点上都有编号,把这些节点随意地构成二叉树,请编程输出该二叉树的前序遍历序列,中序遍历序列,后序遍历序列。
输入:
第一行是n(n小于100),表示有n个节点,每个节点按1到n依次编号。第一行后有n行,每行三个正整数i、l、r,分别表示节点i及对应的左右孩子的编号,如果不存在孩子则以-1表示。三个整数之间用一个空格隔开。
输出:
输出该二叉树的前序遍历序列,中序遍历序列,后序遍历序列。
样例输入:
4
1 2 4
3 1 1
2 -1 -1
4 -1 -1
样例输出:
3 1 2 4
2 1 4 3
2 4 1 3
3 1 2 4
示例代码:
#include<iostream>
#include<queue>
using namespace std;
#define NULL 0
struct BTNode {
int data;
BTNode* l, * r;
BTNode(): l(NULL), r(NULL) { }
BTNode(int val) : data(val), l(NULL), r(NULL) { }
};
int node[101], left[101], right[101];
int n, root, rootpos;
BTNode btn[101];
int roottmp[101];
queue<BTNode* > q;
void pre(BTNode* p) {
if (p == NULL) {
return;
}
else {
cout << p->data << " ";
pre(p->l);
pre(p->r);
}
}
void mid(BTNode* p) {
if (p == NULL) {
return;
}
else {
mid(p->l);
cout << p->data << " ";
mid(p->r);
}
}
void post(BTNode* p) {
if (p == NULL) {
return;
}
else {
post(p->l);
post(p->r);
cout << p->data << " ";
}
}
void layer(BTNode* root) {
q.push(root);
while (!q.empty()) {
cout << q.front()->data << " ";
if (q.front()->l != NULL) q.push(q.front()->l);
if (q.front()->r != NULL) q.push(q.front()->r);
q.pop();
}
}
int main() {
int node[101], left[101], right[101];
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> node[i] >> left[i] >> right[i];
btn[i].data = node[i];
roottmp[i] = node[i];
}
//findroot
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (left[j] == roottmp[i] || right[j] == roottmp[i]) {
roottmp[i] = -1;
break;
}
}
if (roottmp[i] != -1) {
root = roottmp[i];
rootpos = i;
}
}
//construct
for (int i = 1; i <= n; i++) {
if (left[i] == -1) {
btn[i].l = NULL;
}
if (right[i] == -1) {
btn[i].r = NULL;
}
for (int j = 1; j <= n; j++) {
if (left[i] == node[j]) {
btn[i].l = &btn[j];
}
if (right[i] == node[j]) {
btn[i].r = &btn[j];
}
}
}
pre(&btn[rootpos]);
cout << endl;
mid(&btn[rootpos]);
cout << endl;
post(&btn[rootpos]);
cout << endl;
layer(&btn[rootpos]);
cout << endl;
return 0;
}
655

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



