求二叉树中节点的最大距离
创作时间:
作者:
@小白创作中心
求二叉树中节点的最大距离
引用
1
来源
1.
https://www.cnblogs.com/always-fight/p/8919734.html
在二叉树中寻找两个节点之间的最大距离是一个常见的算法问题。本文将通过分析二叉树的结构,提出一个高效的递归算法来解决这个问题。
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义 " 距离 " 为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离,求二叉树中节点的最大距离
分析:先画几个不同形状的二叉树,从例子中可以看出,相距最远的两个节点,一定是两个叶子节点,或者是一个叶子节点到它的根节点:
根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论。 对于任意一个节点,以该节点为根,假设这个根有 K 个孩子节点,那么相距最远的两个节点 U和V之间的路径与这个根节点的关系有两种情况:
若路径经过根Root,则U和V是属于不同子树的,且它们都是该子树中到根节点最远的节点,否则跟它们的距离最远相矛盾。
如果路径不经过Root,那么它们一定属于根的K个子树之一。并且它们也是该子树中相距最远的两个顶点。
所以,只需要计算这两种情况的路径距离,并取其大者,就是该二叉树的最大距离。
递归:
- 先弄清楚递归的顺序。在递归的实现中,往往需要假设后续的调用已经完成,在此基础之上,才实现递归的逻辑。在该题中,我们就是假设已经把后面的长度计算出来了,然后继续考虑后面的逻辑;
- 分析清楚递归体的逻辑,然后写出来。比如在上面的问题中,递归体的逻辑就是如何计算两边最长的距离;
- 考虑清楚递归退出的边界条件。也就说,哪些地方应该写return。
注意到以上 3 点,在面对递归问题的时候,我们将总是有章可循。
经过以上的分析,我们可以看出,情况1及2需要不同的信息: 情况1需要子树的最大深度,情况2需要子树的最大距离。只要函数能在一个节点同时计算及传回这两个信息,代码就可以很简单:
int maxDistance(Node * root)
{
int depth;
return helper(root, depth);
}
int helper(Node * root, int &depth)
{
if (root == NULL)
{
depth = 0;
return 0;
}
int ld, rd;
int maxleft = helper(root->left, ld);
int maxright = helper(root->right, rd);
depth = max(ld, rd)+1;
return max(maxleft, max(maxright, ld+rd));
}
热门推荐
慢性闭锁性牙髓炎的发病原因及治疗方法
知识科普:只有工蜂会蜇人?蜇人以后的蜜蜂,为什么会死掉?
一文总结摄影基础知识,满满的干货!
空气炸锅使用普通盘子和碗的注意事项
如何通过驾驶习惯减少油耗以节约成本?油耗管理对环境和经济有何影响?
甘肃省哪个市州最富?甘肃省各市州经济实力排名
《老酒馆》中陈怀海角色原型探究
口水本来就是臭的吗?解析口水的成因与口腔健康
了解老鼠特征习性科学有效灭鼠
稀有金属离子分离膜应用重要性突出 我国相关研究成果不断增多
在近代战争中,吉林出现了哪些战斗英雄
每天食用麦片是否有助于减肥
如何治疗脚底神经痛和五个脚趾疼痛
前端项目发布完整指南:从选择托管平台到监控维护
学籍档案查询管理系统:助力教育管理,提高工作效率
水利工程专业主要学什么-专业课程有哪些
保山风情:探寻历史文化与自然风光的精选旅游线路
【鞋子尺码】女鞋鞋子尺码对照表 鞋子太大了怎么办
绘画要如何才能做到形神兼备
仁青芒觉正确使用的说明
万物生长靠阳光,那么在月光下,植物能进行光合作用吗?
内存条频率是什么意思?怎么看内存条频率?
酒后口角纠纷引发吵闹事件,需要注意理性解决矛盾
美国留学生小额贷款有哪些选择和注意事项
旧墙翻新刷乳胶漆的关键步骤与注意事项
如何通过自动触发短信功能实现个性化营销
一再提醒:痣长在这3个位置,与癌症“密不可分”
泡面有没有营养?健不健康?一文读懂泡面的营养价值与健康影响
吃泡面究竟有哪些危害?你知道吗?
睡觉张嘴呼吸是什么原因?怎么治疗?