694 字
3 分钟
二叉树的直径

题目描述#

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

解题思路#

  1. 深度优先搜索
    • 后序遍历二叉树(左→右→根)
    • 计算每个节点的左右子树高度
  2. 直径计算
    • 节点直径 = 左子树高度 + 右子树高度
    • 更新全局最大直径
  3. 高度传递
    • 节点高度 = max(左高, 右高) + 1
    • 返回给父节点用于计算
  4. 全局变量
    • 使用外部变量记录最大直径
    • 遍历结束时返回该值

关键洞察#

  1. 直径本质
    • 最长路径 = 左最深叶子 → 节点 → 右最深叶子
    • 可能不经过根节点
  2. 高度复用
    • 直径计算依赖子树高度
    • 后序遍历自然获取高度信息
  3. 负高度处理
    • 空节点高度为0
    • 叶子节点高度为1
  4. 全局更新时机
    • 每个节点计算后立即更新最大直径
    • 确保不遗漏任何可能路径

复杂度分析#

指标说明
时间复杂度O(n):每个节点访问一次
空间复杂度O(h):递归栈深度(h为树高,最坏O(n))

代码实现#

/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var diameterOfBinaryTree = function (root) {
let result = -Infinity;
const dfs = (root) => {
if (!root) return 0;
const left = dfs(root.left);
const right = dfs(root.right);
result = Math.max(result, left + right);
return Math.max(left, right) + 1
}
dfs(root);
return result
};
use std::rc::Rc;
use std::cell::RefCell;
use std::cmp::max;
struct TreeNode {
val: i32,
left: Option<Rc<RefCell<TreeNode>>>,
right: Option<Rc<RefCell<TreeNode>>>,
}
impl TreeNode {
fn new(val: i32) -> Self {
TreeNode {
val,
left: None,
right: None,
}
}
}
fn diameter_of_binary_tree(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
let mut max_diameter = 0;
fn dfs(node: &Option<Rc<RefCell<TreeNode>>>, max_diameter: &mut i32) -> i32 {
match node {
None => 0,
Some(n) => {
let n = n.borrow();
let left_depth = dfs(&n.left, max_diameter);
let right_depth = dfs(&n.right, max_diameter);
*max_diameter = max(*max_diameter, left_depth + right_depth);
max(left_depth, right_depth) + 1
}
}
}
dfs(&root, &mut max_diameter);
max_diameter
}
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def diameterOfBinaryTree(root: TreeNode) -> int:
max_diameter = 0
def dfs(node):
nonlocal max_diameter
if not node:
return 0
left_depth = dfs(node.left)
right_depth = dfs(node.right)
max_diameter = max(max_diameter, left_depth + right_depth)
return max(left_depth, right_depth) + 1
dfs(root)
return max_diameter

实际应用场景#

  1. 网络拓扑:计算网络设备间最长通信路径`
  2. 交通规划:道路网络中寻找最长不重复路径`
  3. 游戏开发:游戏地图中NPC最长巡逻路线`
  4. 生物信息学:蛋白质结构中最长原子链识别`

相似题目#

二叉树的直径
https://website-truelovings-projects.vercel.app/posts/algorithms/二叉树的直径/
作者
欢迎来到StarSky的网站!
发布于
2025-08-16
许可协议
CC BY-NC-SA 4.0