【数据结构】树的表达

本文介绍了一种使用左子右兄弟表示法记录树结构中每个节点信息的方法,并通过递归算法实现节点深度的计算及节点信息的格式化打印。代码基于《挑战程序设计竞赛2》中的示例,适用于理解树形数据结构及其操作。

//本文代码系《挑战程序设计竞赛2》P153第一版代码+自己理解的注释

题目简述:打印树的信息

输入:第一行输入n表示点数,接下n行每行输入节点信息(id k c_{1} c_{2}... c_{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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值