题目
树的双亲表示
输入格式
第一行输入n表示结点个数,接下来n行,每行输入一个index和parent,index表示当前结点编号(同时该结点的data值等于index),parent表示index这个结点的双亲结点编号。如果parent为-1,表示index为根节点。保证0<n<1000,index在[1,n]范围内,但根节点编号不一定为1.
输入例1:
3
3 2
1 2
2 -1
输出格式
输出包含7行,每一行的信息分别为:
树的前序遍历序列,用空格分隔
树的后序遍历序列,用空格分隔
树的层次遍历序列,用空格分隔
树的结点个数
输出树上所有的叶子结点,用空格分隔,按照树上的位置从左到右输出
输出树上的叶子结点个数
输出树的高度(只有根结点的树高度记为0)
思路
需要注意的是真实的测试数据并不会给n
代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1001
struct leaf
{
int data;
int parent;
vector<int> sons;
};
leaf a[MAXN];
void inOrderTraverse(leaf* a, int root)
{
cout << root << ' ';
for (int i = 0; i < a[root].sons.size(); i++)
{
inOrderTraverse(a, a[root].sons[i]);
}
}
void postOrderTraverse(leaf* a, int root)
{
for (int i = 0; i < a[root].sons.size(); i++)
{
postOrderTraverse(a, a[root].sons[i]);
}
cout << root << ' ';
}
void levOrderTraverse(leaf* a, int root, int idx)
{
leaf q[MAXN], p;
int head = 1, tail = 2;
if (a == NULL) return;
for (int i = 0; i <= idx; i++)
{
q[i] = a[i];
}
while (head<tail)
{
p = q[head++];
cout << p.data << ' ';
for (int i = 0; i < p.sons.size(); i++)
{
q[tail++] = a[p.sons[i]];
}
}
}
int numCh = 0;
void getLeaf(leaf* a, int root)
{
if (a[root].sons.size() == 0)
{
numCh++;
cout << root << ' ';
return;
}
for (int i = 0; i < a[root].sons.size(); i++)
{
getLeaf(a, a[root].sons[i]);
}
}
int getHeight(leaf* a, int root)
{
if (a[root].sons.size() == 0)
return 0;
else
{
int maxH = 0;
for (int i = 0; i < a[root].sons.size(); i++)
{
int height = getHeight(a, a[root].sons[i]);
if (height > maxH)
{
maxH = height;
}
}
return maxH + 1;
}
}
int main()
{
int idx = 0, parent = 0;
while (cin >> idx >> parent)
{
a[idx].data = idx;
a[idx].parent = parent;
}
//cout << idx << endl;
int root = 0;
for (int i = 1; i <= idx; i++)
{
if (a[i].parent == -1)
root = i;
else
{
a[a[i].parent].sons.push_back(i);
}
}
inOrderTraverse(a, root);
cout << endl;
postOrderTraverse(a, root);
cout << endl;
/*for (int i = 1; i <= idx; i++)
cout << i << ' ';
cout << endl;*/
levOrderTraverse(a, root, idx);
cout << endl;
cout << idx << endl;
getLeaf(a, root);
cout << endl;
cout << numCh << endl;
cout << getHeight(a, root) << endl;
return 0;
}