面试经典(19)--求二叉树中节点的最大距离

本文介绍了一种求解二叉树中相距最远节点间距离的方法,通过维护每个节点左右子树的最大距离来找到最远节点,并通过递归实现算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:写一个程序求二叉树中相距最远的两个节点之间的距离。图3-11 A和B即为所求距离最远的两个节点。

      

我们先作图,看能否找到规律


我们可以看到,所求的两个节点可能经过二叉树的根结点,也可能不经过二叉树的根结点。每个节点维护左右子树最大距离(叶子到当前根节点的最大距离),左子树的最大距离:max1,右子树最大距离:max2,另设所求的二叉树两个节点的最大距离是nMaxLen。如果max1+max2>nMaxLen,需要更新nMaxLen=max1+max2,遍历完整棵二叉树,我们得到nMaxLen。

代码如下:

struct NODE
{
	NODE *pLeft;
	NODE *pRight;
	int nMaxLeft;
	int nMaxRight;
	char data;
};

int nMaxLen=0;

void FindMaxLen(NODE *pRoot)
{
	if(pRoot==NULL)
		return;
	if(pRoot->pLeft==NULL)
		pRoot->nMaxLeft=0;

	if(pRoot->pRight==NULL)
		pRoot->nMaxRight=0;

	if(pRoot->pLeft)//判定条件可省略,不影响结果,但明显不大好,因为我们对pRoot->pLeft==NULL情况已做了处理
		FindMaxLen(pRoot->pLeft);
	if(pRoot->pRight)
		FindMaxLen(pRoot->pRight);

	if(pRoot->pLeft!=NULL)//注意()一定要加上
		pRoot->nMaxLeft=1+(pRoot->pLeft->nMaxLeft>pRoot->pLeft->nMaxRight?pRoot->pLeft->nMaxLeft:pRoot->pLeft->nMaxRight);
	if(pRoot->pRight!=NULL)
		pRoot->nMaxRight=1+(pRoot->pRight->nMaxLeft>pRoot->pRight->nMaxRight?pRoot->pRight->nMaxLeft:pRoot->pRight->nMaxRight);

	//更新nMaxLen
	if(nMaxLen<pRoot->nMaxLeft+pRoot->nMaxRight)
		nMaxLen=pRoot->nMaxLeft+pRoot->nMaxRight;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值