本人大一初学,各位高手轻喷,欢迎交流。
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<vector>
#include<stack>
#include<map>
#include<list>
#include<ctime>
#include<iostream>
#include<cctype>
#include<iomanip>
constexpr auto maxn = 100005;
#define nil -1
using namespace std;
struct NODE
{
int p, l, r;
};
NODE T[maxn];
int n, D[maxn];
void print(int u)
{
int i, c;
cout << "node " << u << ":";
cout << "parent = " << T[u].p << ", ";
cout << "depth = " << D[u] << ", ";
if (T[u].p == nil)
cout << "root, ";
else if (T[u].l == nil)
cout << "leaf, ";
else
cout << "internal node, ";
cout << "[";
for (int i = 0, c = T[u].l; c != nil; i++, c = T[c].r)//从当前结点的左结点开始依次遍历左结点的右兄弟结点,直到为空
{
if (i)
cout << ",";
cout << c;
}
cout << "]" << endl;
}
int depth(int u, int p)
{
D[u] = p;
if (T[u].r != nil)
depth(T[u].r, p);
if (T[u].l != nil)
depth(T[u].l , p+1);
return 1;
}
int main()
{
int i, j, d, v, c, l, r;
cin >> n;
for (int i = 0; i < n; i++)
{
T[i].p = T[i].r =T[i].l= nil;
}
for (int i = 0; i < n; i++)
{
cin >> v >> d;
for (j = 0; j < d; j++)
{
cin >> c;
if (j == 0)//先输入左结点
T[v].l = c;
else//再输入当前结点的左结点的兄弟结点
T[l].r = c;
l = c;//把l替换成左结点的兄弟结点
T[c].p = v;//正在录入的结点是父节点
}
}
for (int i = 0; i < n; i++)//找到父节点
{
if (T[i].p == nil)r = i;
}
depth(r, 0);//从父节点开始往下计算左结点的深度,并往右兄弟结点依次赋值
for (i = 0; i < n; i++)print(i);
return 0;