二叉树的直径
创作时间:
作者:
@小白创作中心
二叉树的直径
引用
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
}
};
热门推荐
WAFER连接器在现代电子领域的多样化应用
河南省会城市的历史背景
一个著名的粒子超重了?并没有!
夫妻房屋产权比例如何分配?二手房70年产权怎么算?小产权房能卖出去吗?
孕期三维彩超检查指南:最佳时间与次数详解
清末史诗人!晋江这位传奇状元的背后
抑制电磁干扰的重要手段——屏蔽!
椰青喝完后椰肉怎么打开
轻松打开椰子的技巧与美味享受,体验热带水果的魅力
女孩命最好的四个时辰 适合女孩的最佳出生时辰
99%新人都不知道的婚礼禁忌,千万别触霉头!
猕猴桃干的功效与作用、禁忌和食用方法
为什么睡前吃甜食会睡得好
丝杆升降机大型化技术要点详解
八字命理中如何判断一个人的发财潜力
《西风颂》的创作背景
保山到西藏自驾游路线全解析
《四月物语》:青春的诗篇与暗恋的温柔
如何把人物画得更像,这3个方法请注意,来听听教授怎么说
毕业自北大、创办新加坡南大哲学系的李晨阳教授:别把独立思考“外包”给AI
壹邦健康知识:进餐顺序对血糖的影响大吗?
通过侯宗原国学易经风水与地理环境的关联
男生戴什么戒指比较好?专业建议来了
全球货币汇率大全:如何实时获取全球主要货币的汇率信息?
加工酸奶管理制度:法律框架与实践规范
RTX3060游戏高效设置与帧数优化
大众文化视域下新媒体短视频的传播力研究
耐心资本向“新”而行 推动中国商业航天厚积薄发
国家能源集团新能源装机破亿千瓦 龙源电力将获400万千瓦资产注入
苦苦等待200多年,达曼人终于加入中国国籍,如今家家挂五星红旗