返回

编码世界的探索之旅:算法[89]题解之二叉树直径

前端

你是否想在算法的世界里探险,挑战自己的思维极限?算法题解系列将带你踏上精彩的旅程,而二叉树直径正是我们即将面对的挑战之一。在这篇文章中,我们将通过递归算法来解决LeetCode题库中的第162题,让你领略算法的魅力和思维的力量。

LeetCode 162:二叉树的直径

题目

给定一棵二叉树,你的任务是找到该树中两个节点之间的最长路径长度。

示例:

       1
      / \
     2   3
    / \
   4   5

这棵二叉树的直径是4,即从节点2到节点5的最长路径。

解法:

我们可以使用递归算法来解决这个问题。对于每个节点,我们可以计算出其左子树和右子树的高度,然后加上自身的高度得到该节点的最大直径。

def diameterOfBinaryTree(root):
  if not root:
    return 0

  leftHeight = height(root.left)
  rightHeight = height(root.right)

  leftDiameter = diameterOfBinaryTree(root.left)
  rightDiameter = diameterOfBinaryTree(root.right)

  return max(leftHeight + rightHeight + 1, leftDiameter, rightDiameter)


def height(root):
  if not root:
    return 0

  return max(height(root.left), height(root.right)) + 1

时间复杂度:

递归算法的时间复杂度为O(n),其中n为二叉树的节点数。这是因为我们遍历了二叉树的所有节点,并且对于每个节点,我们计算其左子树和右子树的高度。

空间复杂度:

递归算法的空间复杂度为O(h),其中h为二叉树的高度。这是因为递归算法在调用栈中存储了每个节点的高度。

示例代码:

class TreeNode:
  def __init__(self, val):
    self.val = val
    self.left = None
    self.right = None

root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

print(diameterOfBinaryTree(root))  # 输出:4

总结:

算法题解系列带你走近算法的世界,通过一道道经典算法题的讲解,让你领略算法的魅力和思维的力量。二叉树直径只是其中一道题目,还有更多精彩的题目等待着你的挑战。让我们一起踏上算法探索之旅,在代码的世界里探险,不断突破自己的思维极限,成为算法高手!