Python
时间复杂度:O(n),其中 n 为二叉树的节点个数。
空间复杂度:O(n)。最坏情况下,二叉树退化成一条链,递归需要 O(n) 的栈空间。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def __init__(self):
self.diameter = 0
def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
self.find(root)
return self.diameter
def find(self, root):
if not root:
return 0
leftDepth = self.find(root.left)
rightDepth = self.find(root.right)
self.diameter = max(leftDepth + rightDepth, self.diameter)
return 1 + max(leftDepth, rightDepth)
Java
法1:DFS两遍
不太好的方法
class Solution {
public int diameterOfBinaryTree(TreeNode root) {
if (root == null) {
return 0;
}
int left = diameterOfBinaryTree(root.left);
int right = diameterOfBinaryTree(root.right);
int cur = oneSideDepth(root.left) + oneSideDepth(root.right);
return Math.max(cur, Math.max(left, right));
}
public int oneSideDepth(TreeNode node) {
if (node == null) {
return 0;
}
return Math.max(oneSideDepth(node.left), oneSideDepth(node.right)) + 1;
}
}
法2:最佳DFS
设置全局变量!简化DFS!
class Solution {
int res = 0;
public int diameterOfBinaryTree(TreeNode root) {
if (root == null) {
return 0;
}
maxDepth(root);
return res;
}
public int maxDepth(TreeNode node) {
if (node == null) {
return 0;
}
int left = maxDepth(node.left);
int right = maxDepth(node.right);
res = res >= left + right ? res : left + right;
return 1 + Math.max(left, right);
}
}
文章讨论了两种方法计算二叉树的最大直径,一种是递归两次计算左右子树的直径,另一种是使用全局变量简化DFS过程,后者更高效。
961

被折叠的 条评论
为什么被折叠?



