694 字
3 分钟
二叉树的直径

题目描述
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root
。
两节点之间路径的 长度 由它们之间边数表示。
解题思路
- 深度优先搜索:
- 后序遍历二叉树(左→右→根)
- 计算每个节点的左右子树高度
- 直径计算:
- 节点直径 = 左子树高度 + 右子树高度
- 更新全局最大直径
- 高度传递:
- 节点高度 = max(左高, 右高) + 1
- 返回给父节点用于计算
- 全局变量:
- 使用外部变量记录最大直径
- 遍历结束时返回该值
关键洞察
- 直径本质:
- 最长路径 = 左最深叶子 → 节点 → 右最深叶子
- 可能不经过根节点
- 高度复用:
- 直径计算依赖子树高度
- 后序遍历自然获取高度信息
- 负高度处理:
- 空节点高度为0
- 叶子节点高度为1
- 全局更新时机:
- 每个节点计算后立即更新最大直径
- 确保不遗漏任何可能路径
复杂度分析
指标 | 说明 |
---|---|
时间复杂度 | 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
实际应用场景
- 网络拓扑:计算网络设备间最长通信路径`
- 交通规划:道路网络中寻找最长不重复路径`
- 游戏开发:游戏地图中NPC最长巡逻路线`
- 生物信息学:蛋白质结构中最长原子链识别`