二叉树求根节点到其他节点距离

题目要求

给定一棵二叉树,假设其结点个数为n,结点的编号为1~n,且根节点的编号为1,试编写程序求从根节点
到其他每个结点的距离。要求:用左右链的方式存储树结构。
输入格式:
第一行为一个整数n,表示树的结点的个数,n<1000下面n行中,每行都有两个整数a和b,其中第i行表示编号为i的结点的左孩子结点的编号为a,右孩子结点的编号为b。当a=0时,表示结点i没有左孩子:当b=0时,表示结点i没有右孩子。
输出格式:
输出n个整数,表示各个结点到根结点的距离。
输入样例:
4
23
04
00
00
输出样例:
0112

思路

涉及到二叉树求路径长度的问题,采用递归的方法,设置一个初始距离k为0,递归函数中先传入根节点,根节点到自身的距离为0,所以直接将距离变量的值更新到dist数组中,然后检测根节点是否有左孩子,如果有就递归调用自身,并把左孩子的位置和k+1作为参数传入。再同理检测右孩子,执行完之后dist数组中对应位置的值就是根节点到每个节点的距离。

代码实现

#define MAXNUM 1000
#include<stdio.h>
int dist[MAXNUM];			//存放二叉树从根节点到各个节点的距离,初始为0
typedef struct BTNode
{
	int data;				//结点的数据(程序中没有用到,可忽略)
	int Lchild, Rchild;     //左孩子和右孩子的位置
}BTNode;
BTNode tree[MAXNUM];
void Btree_distance(int num, int k);
int main()
{
	int n,p,q;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)	//循环输入n行数据,填充二叉树节点数据
	{
		scanf("%d%d", &p, &q);
		tree[i].Lchild = p;
		tree[i].Rchild = q;
		dist[i] = 0;			//初始化dist数组
	}
	Btree_distance(0, 0);		//将根节点和初始距离0传入
	for (int i = 0; i < n; i++)
		printf("%d", dist[i]);
	system("pause");
	return 0;
}
void Btree_distance(int num, int k)
{
	dist[num] = k;				//k的值代表当前节点到根节点的距离,直接存到dist数组的对应位置
	if (tree[num].Lchild != 0)
		Btree_distance(tree[num].Lchild -1, k + 1);		//递归调用自身求左子树到根节点的距离
	if(tree[num].Rchild != 0)
		Btree_distance(tree[num].Rchild -1, k + 1);		//同上
}
注意

递归函数中传入的第一个值是tree[num].Lchild -1,这里减一是因为题目要求二叉树根节点序号为1,而数组是从0开始存。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

举个锤子²³³³

有钱的捧个钱场,没钱的借去

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值