543. 二叉树的直径:
题目链接 :543. 二叉树的直径
题目:
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
思路:
1、递归计算,划分子问题为:
-
左子树的最长路径
-
右子树的最长路径
-
经过当前根节点的最长路径(左子树深度+右子树深度)
-
明确递归子问题后,我们分别对三个子问题进行求解,注意这里我们使用了在线算法:即将递归子问题中得到的变量与一个维护的全局变量进行比对,保留二者中符合条件的。
-
还要注意,我们需要的是二叉树直径,也就是树内穿过任意两个节点间最长路径长度,但是在实际递归函数返回值中,我们需要把本次递归看成子树子问题,也就是要返回深度值为上级递归调用。
AC代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
//在线算法
int max=0;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return max;
}
public int dfs(TreeNode node)
{
if(node==null)
{
return 0;
}
int l=dfs(node.left);
int r=dfs(node.right);
max=Math.max(l+r,max);
return 1+Math.max(l,r);
}
}