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

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

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


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;
}

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

  • 23
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值