//本文代码系《挑战程序设计竞赛2》P153第一版代码+自己理解的注释
题目简述:打印树的信息
输入:第一行输入n表示点数,接下n行每行输入节点信息(id k )
输出:按照格式输出节点信息(格式略)
代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include <stdlib.h>
using namespace std;
#define MAX 100005
#define NIL -1
struct Node{
int p,l,r;
};//利用“左子右兄弟表示法”记录每个节点的信息
Node T[MAX];
int n,D[MAX];
//打印相关信息
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(i=0,c=T[u].l;c!=NIL;i++,c=T[c].r){
if(i)cout<<',';//排版
cout<<c;//输出子节点的序号
}
cout<<']';
}
//递归求深度
int rec(int u,int p){
D[u]=p;//记录深度
if(T[u].r!=NIL)rec(T[u].r,p);//右兄弟和自己的深度相同
if(T[u].l!=NIL)rec(T[u].l,p+1);//左子是自己深度+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].l=T[i].r=NIL;//初始化
for(int i=0;i<n;i++){
cin>>v>>d;
for(int 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;//遍历,寻找根
rec(r,0);//从根开始利用递归记录各个节点深度
for(i=0;i<n;i++)print(i);//打印所有节点的信息
return 0;
}
本文介绍了一种使用左子右兄弟表示法记录树结构中每个节点信息的方法,并通过递归算法实现节点深度的计算及节点信息的格式化打印。代码基于《挑战程序设计竞赛2》中的示例,适用于理解树形数据结构及其操作。
761

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



