Aizu ALDS1_7_B Binary Trees
#include<bits/stdc++.h>
using namespace std;
#define MAX 30
#define NIL -1
struct Node{
int parent,left , right;
};
Node T[MAX];
int D[MAX],H[MAX];
void init(int n){
for(int i=0;i<n;i++){
T[i].parent =NIL;
}
}
int getsibling(int u){
if(T[u].parent==NIL)return NIL;
if( T[T[u].parent].left ==u && T[T[u].parent].left!=NIL){
return T[T[u].parent].right;
}else if(T[T[u].parent].right ==u && T[T[u].parent].right!=NIL){
return T[T[u].parent].left;
}
return NIL;
}
void setDepth(int u, int p){
if(u==NIL)return ;
D[u]=p;
setDepth(T[u].left,p+1);
setDepth(T[u].right,p+1);
}
int setHeight(int u){
int h1=0,h2=0;
if(T[u].left!=NIL){
h1= setHeight(T[u].left) +1;
}
if(T[u].right!=NIL){
h2= setHeight(T[u].right) +1;
}
return H[u]= max(h1,h2);
}
void print(int n){
for(int i=0;i<n;i++){
cout<<"node "<<i<<": ";
cout<<"parent = "<<T[i].parent<<", ";
cout<<"sibling = "<<getsibling(i)<<", ";
int deg=0;
if(T[i].left!=NIL){++deg;}
if(T[i].right!=NIL){++deg;}
cout<<" degree = "<<deg<<", ";
cout<<"depth = "<<D[i]<<", ";
cout<<"height = "<<H[i]<<", ";
if(T[i].parent==NIL){cout<<"root";}
else if(T[i].left==NIL && T[i].right==NIL){cout<<"leaf";}
else{cout<<"internal node";}
cout<<endl;
}
}
int main(){
int n,k,l,r,root=0;
cin>>n;
for(int i=0;i<n;i++){
T[i].parent =NIL;
}
for(int i=0;i<n;i++){
cin>>k>>l>>r;
T[k].left=l;
T[k].right=r;
if(l!=NIL){T[l].parent=k;}
if(r!=NIL){T[r].parent=k;}
}
for(int i=0;i<n;i++){
if(T[i].parent==NIL){root=i;}
}
setDepth(root,0);
setHeight(root);
print(n);
return 0;
}