今天是12月日更的第二天,今天带来的题目是二叉树的直径,正文如下。

题目

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例:给定二叉树

1
/ \
2 3
/ \
4 5

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。

解题思路

根据本题的题意,我们得知二叉树路径的长度为该路径经过的节点数 -1,所以求直径等效于求路径经过节点数的最大值 -1;所以我们可以使用深度优先搜索的方式来解答此题,首先定义一个全局变量值 maxd, 用于记录最长的路径,接下来遍历二叉树的三个步骤为:

  1. 函数参数与返回值:输入参数为传入的节点,返回值为节点的最大深度;
  2. 终止条件:当节点位 null 时,返回 0;
  3. 递归单层逻辑:递归调用左子树和右子树,求得节点的最大直径;

代码实现

class Solution {
int maxd=0;
public int diameterOfBinaryTree(TreeNode root) {
depth(root);
return maxd;
}
public int depth(TreeNode node){
if(node==null){
return 0;
}
int Left = depth(node.left);
int Right = depth(node.right);
//将每个节点最大直径(左子树深度+右子树深度)当前最大值比较并取大者
maxd = Math.max(Left+Right, maxd);
//返回节点最大深度
return Math.max(Left,Right)+1;
}

最后

复杂度分析:

  • 时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
  • 空间复杂度:O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height) 。