543. 二叉树的直径 + 树递归
543. 二叉树的直径
LeetCode_543
题目描述
代码实现
- 代码撰写的时候需要注意的是left+right+1会多算一个结点。
- 在返回最终答案的时候需要减去一个结点(树的高度决定的)。
/**
* 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 maxSum = 1;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return maxSum - 1;
}
public int dfs(TreeNode root){
if(root == null)
return 0;
int left = dfs(root.left);
int right = dfs(root.right);
maxSum = Math.max(maxSum, left + right + 1);
return Math.max(left, right) + 1;
}
}
复杂度分析
- 时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
- 空间复杂度:O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height) 。
Either Excellent or Rusty