Const
Definition for a binary tree node. class TreeNode { val: number left: TreeNode | null right: TreeNode | null constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { this.val = (val===undefined ? 0 : val) this.left = (left===undefined ? null : left) this.right = (right===undefined ? null : right) } }
链的定义:从子树中的叶子节点到当前节点的路径长度。
核心思路:
DFS函数说明:dfs(node)
返回以当前节点为根的子树的最大链长,不包含当前节点到父节点的边。
示例树结构:
1
dfs(l)+1 / \ dfs(r)+1
2 3
/ \ \
4 5 6
链长计算过程:
直径计算:
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function diameterOfBinaryTree(root: TreeNode | null): number {
let ans: number = 0;
function dfs(node: TreeNode | null): number {
if (!node) {
return -1;
}
const left = dfs(node.left);
const right = dfs(node.right);
ans = Math.max(ans, left + right + 2); // 左子树最大链长+1,就是加上左子树到当前节点的边,右子树最大链长+1,就是加上右子树到当前节点的边。两条链拼成路径,更新最大值
return Math.max(left, right) + 1;// 当前子树的左右子树最大链长加上当前节点到子树的边就是当前子树的最大链长
}
dfs(root);
return ans;
};
543.二叉树的直径
给你一棵二叉树的根节点
root
,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点。
路径长度 是由边数表示。
示例 1:
输入:
root = [1,2,3,4,5]
输出:
3
解释: 3 条最长路径分别为 [4,2,1,3], [5,2,1,3], 或 [4,2,1,5],路径长度均为 3。示例 2:
输入:
root = [1,2]
输出:
1
提示:
[1, 10^4]
-100 <= Node.val <= 100