【从零单排之微软面试100题系列】11之二叉树中结点的最大距离

本文详细介绍了如何求解二叉树中相距最远的两个节点之间的距离,并通过示例代码展示了实现过程。重点在于理解最大距离的可能情况和如何在树结构中查找两个节点的最近公共祖先。

原题参见july大神博客系列【微软面试100题】


题目描述:求一棵二叉树中相距最远的两个节点之间距离,“距离”定义为两个结点间“边”的个数

 

分析思路:最大距离可能是从根结点到某一叶子结点,也可能是从一个叶子结点到另一个叶子结点。对于前者,树的高度就是最大距离,对于后者,找到这两个结点的第一个公共祖先结点,最大距离即为祖先结点的左右子树高度之和。在实现的时候,取左子树的最远距离、右子树的最远距离、左子树高度与右子树高度之和的三者中的最大值作为树的最远距离。


参考代码如下:

int MaxDistance(Node* root)
{
	int depth = 0;
	return CoreFunction(root, depth);
}


int CoreFunction(Node* root, int &depth)
{
	if( root == NULL)
	{
		depth = 0;
		return 0;
	}

        //ld和rd获取左子树和右子树的高度
	int ld = 0;
	int rd = 0;
	//获取左子树和右子树的最远距离
	int maxleft = CoreFunction(root->left, ld);
	int maxright = CoreFunction(root->right, rd);
	depth = max(ld, rd) + 1 ;//更新当前结点的高度
  
        //返回左子树的最远距离、右子树的最远距离、左子树高度与右子树高度之和中的最大值
	return max(ld + rd , max(maxleft, maxtright));
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值