一.题目
1.题目详情
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
要求:返回最长路径
力扣链接:543. 二叉树的直径 - 力扣(Leetcode)https://leetcode.cn/problems/diameter-of-binary-tree/description/二.解题思路(看题解的,我的是错的)
1.找二叉树最长子路径,可以将题目转换为求两个结点之间的最短路径
2.求两个结点的最短路径,就可以看成是找两个结点的共同父节点到他们两个的距离
(即他们的深度(共同父节点深度-自己的深度)和)
3.通过dfs算法求得结点的深度
4.求得任意两个结点的深度和中的最大值
三.代码
class Solution {
public int len;
public int dfs(TreeNode root){
if(root==null){
return 0;
}else{
int L,R;
L=dfs(root.left);
R=dfs(root.right);
len=Math.max(len,L+R);
return Math.max(L,R)+1;
}
}
public int diameterOfBinaryTree(TreeNode root) {
len=0;
dfs(root);
return len;
}
}
四.题后语(就是瞎bb)
这道题拿到手,我的第一反应是用深度优先算法找到最长路径,但是代码写到一半,反应过来,最长的路径不一定是从根结点开始,一下子就让我陷入了思考。一开始我是想用回溯法进行解决,在演算了一遍后发现还是没有办法解决不过根结点这个点。然后我又想过将树进行旋转,改变结构然后算路径,但是这样做的话就把问题给复杂化了。在百思不得其解的情况下(想不到怎么绕过根结点求两点距离),我看了下题解,题解告诉我,求两点间距离可以看成求,两点到他们共同父结点距离,一下子就让我豁然开朗。