第六章代码题(三)

 前篇:

第一章代码题_永无魇足的博客-CSDN博客

第二章代码题(一)_永无魇足的博客-CSDN博客

第二章代码题(二)_永无魇足的博客-CSDN博客

第二章代码题(三)_永无魇足的博客-CSDN博客

第三章代码题(一)_永无魇足的博客-CSDN博客

第三章代码题(一)_永无魇足的博客-CSDN博客

第六章代码题(一)_永无魇足的博客-CSDN博客 

第六章代码题(二)_永无魇足的博客-CSDN博客

 6.二叉链表存储的二叉树中,输出从根节点到每个叶子结点的路径。

可以创建一个数组,如果不是叶子结点那么就将结点的值存进数组内,当找到叶子结点时将当前数组的元素全部进行输出。此外,需要一个索引永远指向数组插入元素的位置。这个索引极其重要,它除了向数组中插入元素外,遍历也靠它输出,其次递归中显示其他叶子结点的路径也靠它覆盖相应位置的元素。

代码:

//第六题 找从根结点到每个叶子结点的路径
void  FindPath(BiTree btree,ElemType a[],int length ) {
	if (btree==NULL)
	{
		return;
	}
	if (btree->Lchild==NULL&&btree->Rchild==NULL)
	{
		printf("\n%d的路径为:", btree->data);

		for (int  i = 0; i < length; i++)
		{
			printf("%d,", a[i]);
		}
	}
	else
	{
		a[length++] = btree->data;
		FindPath(btree->Lchild, a, length);
		FindPath(btree->Rchild, a, length);

	}
}

验证:

int main() {

	BiTree btree = (BiTree)malloc(sizeof(BiTnode));
	InitTree(&btree);

	srand(time(NULL));

	for (int  i = 0; i < MaxSize; i++)
	{
		btree=AddNode(btree, rand()%100+1);
	}
	printf("\n中序遍历\n");
	MiddleTraversal(btree);
	printf("\n前序遍历\n");
	BeforeTraversal(btree);
	
	int a[10] = { 0 };
	int length = 0;
	FindPath(btree, a, length);
    return 0;
}

执行结果:

 画出二叉树:

7.二元数组,按先序次序输出各结点的内容及相应的层次数。

这道题也是在函数里面对数组赋值,输出的形式是一个结点的值,和该结点所在的层数。那么直接将二元数组的列数定为2,行数和二叉树的结点数一样多(二叉树的结点数一直是用宏定义来操控的,所以直接设置为MAXSIZE即可)。

先序决定代码的顺序,那么就是中左右,先进行赋值,然后进行递归。

函数的参数除了二叉树和二元数组外,还有一个整数k,用来确定结点的层数。这里的思路和第六题有点相像,也从侧面体现了递归的特点;同一层数的结点的k的值不会受到影响,即各干各的。

第六题是直接将数组对应位置的元素覆盖了,很明显这道题得保证对应位置的元素,所以就要靠全局变量的特点,即便是递归,插入元素的位置的索引也一直在往前移动。

代码:

int i = 0;
//第七题 二元组输出先序次序的各结点的内容及相应的层次数。
void   TreeLevel(int a[MaxSize][2], BiTree btree,int k) {

	if (btree==NULL)
	{
		return;
	}

	a[i][0] =  btree->data;
	a[i++][1] = k++;
	TreeLevel(a,btree->Lchild,k);
	TreeLevel(a, btree->Rchild,k);

}

 验证:

int main() {

	BiTree btree = (BiTree)malloc(sizeof(BiTnode));
	InitTree(&btree);

	srand(time(NULL));

	for (int  i = 0; i < MaxSize; i++)
	{
		btree=AddNode(btree, rand()%100+1);
	}
	printf("\n中序遍历\n");
	MiddleTraversal(btree);
	printf("\n前序遍历\n");
	BeforeTraversal(btree);
//第七题
	int b[MaxSize][2];
	TreeLevel(b, btree,1);
	printf("\n");
	for (int i = 0; i < MaxSize; i++)
	{
		printf("{");
		printf("%d,", b[i][0]);
		printf("%d", b[i][1]);
		printf("}");
	}
	return 0;
}

执行结果:

 按照先序次序的要求直接从结果就能看出来是正确的,将二叉树画出来验证对应的层数是否正确:

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值