【数据结构】(树)已知一棵树的层次序列以及每个结点的度,编写算法构造此树的孩子兄弟链表

已知一棵树的层次序列以及每个结点的度,编写算法构造此树的孩子兄弟链表

算法思想:已知先序遍历以及结点度数我们只需要编写代码给每一个除根结以外的结点寻找他们的兄弟和孩子(利用度数寻找孩子与兄弟,利用层次遍历构造辅助数组)详见代码


void createCSTree_Degree(CSTree *&T,int data[],int degree[],int n){

	CSTree **temp=(CSTree**)malloc(sizeof(CSTree)*n); //创建临时数组
	for(int i=0;i<n;i++){  //把每一个节点放进临时数组
		temp[i]=(CSTree*)malloc(sizeof(CSTree));
		temp[i]->data=data[i];
		temp[i]->lchild=temp[i]->sright=NULL; //初始化兄弟与孩子结点
			
	}
	//构造完临时数组之后我们得到了先序序列的结点数组接下来我们根据结点的度来确定每一个结点的儿子与儿子的兄弟结点
	int index=1; //指向数组还未操作的结点 默认根节点已经被操作了
	int d;//d表示当前结点的度数;
	for(int j=0;j<n;j++){
		d=degree[j];   //获取当前结点的度数

		//接下来找他的儿子与儿子兄弟

		//首先要知道叶子结点的是没有兄弟和孩子的所以先进行一个判断  注:叶子结点的度数为0

		if(d){  //若不是叶子结点 开始找儿子 
			temp[j]->lchild=temp[index];  //首先找到第一个儿子结点
			
			for(int k=2;k<=d;k++){  //然后给第一个儿子结点找兄弟结点 注意 k=2 表示的是 从第二个孩子开始 一共有 d孩子 d是度数
				index++;
				temp[index-1]->sright=temp[index]; //index -1 为上一个孩子结点也就是 父节点的第一个孩子/或者是上一个孩子的兄弟 剩下的孩子结点依次是上一个孩子的右兄弟
			}
		}

	}
	//找完所有孩子结点与孩子的兄弟结点后就返回头指针 //注意这里是函数参数返回的
	T=*temp;
}

构造过程大概就是这样
在这里插入图片描述

AV_TIME_BASEFFmpeg中定义的一个宏,它表示时间单位的基准。具体地说,它表示每秒钟的时间单位数。在FFmpeg中,时间单位被表示为有理数,即分子分母的形式。AV_TIME_BASE的值为1000000,表示每秒钟有1000000个时间单位。 中提到了不同的time_base。在FFmpeg中,每个AVStream(音视频流)都有一个time_base字段,用于表示该流中的时间单位。AVStream的time_base与AVCodecContext的time_base字段有关。AVStream的time_base比AVCodecContext的time_base精度更高,即分子的值更小。例如,AVStream的time_base为1/90000,而AVCodecContext的time_base为1/30(假设frame_rate为30)。在相同的ptsdts情况下,以AVStream的time_base为单位的数值会比以AVCodecContext的time_base为单位的数值大。 因此,AV_TIME_BASE是一个重要的宏,用于在FFmpeg中进行时间单位的换算处理。了解AV_TIME_BASE的含义使用方式对于阅读理解FFmpeg的代码非常重要。 来源:ffmpeg存在多个时间基准(time_base),对应不同的阶段(结构体),每个time_base具体的值不一样,ffmpeg提供函数在各个time_base中进行切换。搞清楚各个time_base的来源,对于阅读ffmpeg的代码很重要。 来源:InputStream(AV_TIME_BASE) 到 AVPacket(AVStream->time_base) 来源:AVStream->time_base 比 AVCodecContext->time_base 精度要高(数值要小),比如AVStream->time_base为1/90000,而AVCodecContext->time_base为1/30(假设frame_rate为30);同样的ptsdts,以AVStream->time_base为单位,数值要比以AVCodecContext->time_base为单位要大。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值