📜  获取二叉树的直径 (1)

📅  最后修改于: 2023-12-03 15:27:48.876000             🧑  作者: Mango

获取二叉树的直径

在二叉树中,每个节点都有一个左子树和右子树,它们的深度可能不同,因此我们需要找到二叉树中最长的一段路径,这个路径称为二叉树的直径。下面我们将介绍如何在算法中找到二叉树的直径。

算法思路

我们可以使用递归的方式来遍历二叉树,在遍历的同时,计算每个节点的左右子树的深度,然后求和,得到每个节点的直径。在遍历过程中,我们记录下最大的直径,这个最大的直径即为二叉树的直径。

例如,对于以下二叉树:

       1
      / \
     2   3
    / \
   4   5

可以得到以下遍历顺序:

  1. 遍历节点 4,记录深度为 1,子树直径为 1
  2. 遍历节点 5,记录深度为 1,子树直径为 1
  3. 遍历节点 2,记录深度为 2,子树直径为 2
  4. 遍历节点 3,记录深度为 1,子树直径为 1
  5. 遍历节点 1,记录深度为 3,子树直径为 3(即左子树深度 2 + 右子树深度 1)
  6. 计算最大直径,得到结果为 3。
算法实现

以下是用 Python 实现二叉树直径的代码片段:

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

class Solution:
    def diameterOfBinaryTree(self, root: Node) -> int:
        self.res = 0

        def dfs(node):
            if not node: return 0
            left_depth = dfs(node.left)
            right_depth = dfs(node.right)
            self.res = max(self.res, left_depth + right_depth)
            return max(left_depth, right_depth) + 1

        dfs(root)
        return self.res

首先定义了一个 Node 类,用于存储二叉树中的节点信息,包括节点的值以及左右子树的引用。接着定义了一个 Solution 类,其中 diameterOfBinaryTree 函数用于计算二叉树的直径。

在函数内部,我们使用 dfs 函数遍历二叉树,每次记录左子树和右子树的深度,然后求和并更新最大直径。函数中定义了一个 self.res 变量,用于记录最大直径,dfs 函数中不断更新这个变量。最后返回 self.res 即为二叉树的直径。

总结

本文介绍了如何使用递归算法计算二叉树的直径。算法思路比较简单,主要是对每个节点的左右子树深度进行求和,然后找到最大值。如果您对二叉树的基础知识还不够熟悉,建议先学习二叉树的基本概念和遍历方法。