二叉树的直径
创作时间:
作者:
@小白创作中心
二叉树的直径
引用
CSDN
1.
https://blog.csdn.net/2302_80190174/article/details/140110619
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点。两节点之间路径的 长度 由它们之间边数表示。
图中二叉树的直径也就是三条红线。
深度优先搜索
首先我们知道一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。
而任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。
如图我们可以知道路径 [ 4, 2, 1] 可以被看作以 1 为起点,从其左儿子向下遍历的路径 [1, 2, 4] 和从其右儿子向下遍历的路径 [1 , 3] 拼接得到。
假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 L (即以左儿子为根的子树的深度) 和其右儿子向下遍历经过最多的节点数 R (即以右儿子为根的子树的深度),那么以该节点为起点的路径经过节点数的最大值即为 L+R+1 。
最后的算法流程为:我们定义一个递归函数 depth(node) ,函数返回该节点为根的子树的深度。先递归调用左儿子和右儿子求得它们为根的子树的深度 L 和 R ,则该节点为根的子树的深度即为:max( L , R ) + 1 。
class Solution {
int ret;
int depth(TreeNode* root){
if (root == NULL) {
return 0; // 空节点返回0
}
int L = depth(root->left); // 左子树的深度
int R = depth(root->right); // 右子树的深度
ret = max(ret, L + R + 1); // 计算即L+R+1 并更新ret
return max(L, R) + 1; // 返回该节点为根的子树的深度
}
public:
int diameterOfBinaryTree(TreeNode* root) {
ret = 1;
depth(root);
return ret - 1;//root为空时,返回1-1即0
}
};
热门推荐
确诊深静脉血栓的检查方法详解
扫描全能王为什么生成pdf失败
如何处理股票交易中的误操作问题
缴契税签合同需要注意哪些法律事项?全面解读与实务指南
假设柏林战役德国人胜利了,二战还会继续下去吗?
古代太医身份与净身制度:医学专业的特权
社工如何写项目需求分析
企业资源整合的流程包括哪些步骤?
西安社保中断是不是白交了?可以补缴吗?
保费分期与全额退保:保险购买中的费用问题详解
2024年CGT领域创新趋势:应用领域拓宽、治疗策略革新、成本降低
网贷协商减免利息违约金的具体操作步骤
熬夜后出现头疼眩晕该如何处理
面部识别技术:AI 如何识别人脸
易经数字0到9分别代表什么
肝虚怎么调理效果最好
匹多莫德片:免疫调节剂的作用机制与临床应用
润滑油的种类、成分与应用:生活中不可或缺的重要角色分析
捷克陨石价格多少钱一克?揭秘!市场行情、品质鉴别与收藏价值深度剖析
新质农业——变量播种技术
如何完善个税申报数据库
糖尿病患者可以吃芒果吗?医生的专业建议来了
如何通过K线图解读均线?
K线图的线条含义是什么?这些线条在技术分析中的作用如何?
MCN:多频道网络的运作模式与发展趋势
不给孩子吃芒果的理由只有一个(不是过敏)
团队管理问题识别与解决指南
如何利用空值填充数据库
上海Major八进四前瞻:MongolZ初立凌云志,NiKo重拾追梦心
突然低血压是什么原因造成的