#include<iostream>
using namespace std;
#define MAX 100005
#define NIL -1
struct node{
int p,r,l;
};
node T[MAX];
int n,D[MAX];
void print (int u){
int i,c;
cout << "node" <<u<<" : ";
cout << "parent" << T[u].p<<",";
cout<< "depeth"<<D[u] <<",";
if(T[u].p==NIL){
cout << "root, ";
}else if(T[u].l==NIL){
cout <<"leaf, ";
}else
cout << "中间节点, ";
cout<<" [ ";
for(i=0,c=T[u].l;c!=NIL;i++,c=T[c].r){
if(i){
cout<<" ,";
}
cout << c;
}
cout <<" ]"<<endl;
}
//递归求深度(只需要遍历一次)
void rec(int r ,int p){
D[r]=p;
if(T[r].r!=NIL){
rec(T[r].r,p);
}
if(T[r].l!=NIL){
rec(T[r].l,p+1);
}
}
int main(){
int i,j,d,v,c,l,r;
cin >> n;
for (i = 0;i< n;i++ ){
T[i].p=T[i].l=T[i].r=NIL;
}
for(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;
T[c].p=v;
}
}
for(i=0;i<n;i++){
if(T[i].p==NIL){
r=i;
break;
}
}
rec(r,0);
for(i=0;i<n ;i++){
print(i);
}
return 0;
}
这里用了左子右兄弟的结构体
左子 : 代表该节点的是否有 左儿子
右兄弟 : 判断该节点时候相邻的右兄弟
具体的话 代码通俗易懂 (这仅仅是数的入门而已)