二叉树的直径

2025年03月17日 | 阅读 9 分钟

二叉树的直径可以定义为连接二叉树中任意两个节点的最长路径的边数。二叉树的直径也称为二叉树的宽度。代表二叉树直径的路径可以经过二叉树的根节点,也可以不经过。路径包含两个叶节点,其中一个叶节点是计算直径的起点。

连接两个节点的最长路径,代表二叉树的直径,有两种可能:

  1. 经过根节点: 该路径将穿过二叉树的根节点,并且也计入根节点。
  2. 不经过根节点: 在这种情况下,所选路径将不穿过二叉树的根节点,并且在路径中不计入根节点。
Diameter of Binary Tree

在上图 1 中,最长路径连接叶节点 4 和叶节点 6,并且会经过根节点 1。图 1 中二叉树的直径为 6,从叶节点 4 到叶节点 6,即节点 4 - 节点 2 - 节点 1 - 节点 3 - 节点 5 - 节点 6,也包括根节点。

而在图 2 所示的二叉树中,连接两个节点的最长路径,用于计算二叉树的直径,是从叶节点 5 到叶节点 6 开始,但不包括根节点 1。该二叉树的直径为 5,沿路径节点 5 - 节点 3 - 节点 2 - 节点 4 - 节点 6,不包括根节点 1。

查找二叉树直径的方法

查找二叉树的直径是数据结构中一个非常常见的问题,有很多方法可以找到该问题的解决方案。现在我们对如何查找二叉树的直径有了一个概念,接下来让我们看看解决这个问题的不同方法或途径。

解决此问题有两种不同的方法:递归方法迭代方法。两种方法都有不同的途径以及不同的时间和空间复杂度。

1. 递归方法

在这种方法中,使用递归函数查找两个子树的高度,然后借助这两个子树的高度,计算整个二叉树的直径。由于递归函数的重复调用,递归方法的时间和空间复杂度较高。

现在,我们用递归的方法来编写一个 Java 代码,用于查找二叉树的直径。

代码

输出:上述代码的输出是

The diameter of the binary tree is 6

在上面的代码中,我们使用了名为 getDiameter() 的递归函数。该函数将被反复调用,以查找二叉树的左子树和右子树的高度,然后利用这些高度计算二叉树的直径。由于递归函数的重复调用,与迭代方法相比,时间复杂度和空间复杂度非常高。

查找二叉树直径的时间复杂度为:O(n^2)

查找二叉树直径的空间复杂度为:O(log n)

2. 迭代方法

不使用递归函数,而是以深度优先搜索的方式遍历二叉树,以查找二叉树的直径。由于我们以深度优先的方式遍历二叉树,这将帮助我们找到距离最深的或最远的叶节点,然后从该叶节点到另一个节点的路径将被计算以获得树的直径。此方法的时间和空间复杂度都较低。

在这个方法中,迭代方法的空间复杂度低于查找树直径的递归方法,因为没有重复的递归调用会增加这些复杂度。

现在,我们用迭代的方法来编写一个查找二叉树直径的代码。

代码

输出: 以上代码的输出为

The diameter of the given tree is 4

在上面的代码中,我们使用迭代方法计算了二叉树的直径。迭代方法中有重复的递归调用。在此方法中,空间和时间复杂度远低于递归方法。

查找二叉树直径的迭代方法的时间复杂度为 O(n)

查找二叉树直径的迭代方法的空间复杂度为 O(n)


下一主题二叉树的高度