题目
- 给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。
两个节点之间的路径长度 由它们之间的边数表示。
![]()
题解:后序遍历
- 通过深度优先搜索后序遍历二叉树,计算并更新每个节点的同值路径长度,最终找出最长的同值路径。
var longestUnivaluePath = function(root) {
let res = 0; // 用于存储最大同值路径的长度
// 深度优先搜索(DFS)函数
const dfs = (root) => {
if (root == null) return 0; // 如果节点为空,返回0
// 递归访问左子树和右子树
const left = dfs(root.left); // 左子树的同值路径长度
const right = dfs(root.right); // 右子树的同值路径长度
let leftPath = 0, rightPath = 0; // 初始化左路径和右路径的长度
// 如果左子节点的值与当前节点相同,更新左路径长度
if (root.left && root.left.val == root.val) {
leftPath = left + 1; // 加上当前边的长度
}
// 如果右子节点的值与当前节点相同,更新右路径长度
if (root.right && root.right.val == root.val) {
rightPath = right + 1; // 加上当前边的长度
}
// 更新最大同值路径的长度
res = Math.max(res, leftPath + rightPath); // 左右路径相加为当前节点的同值路径
// 返回当前节点的最长同值路径长度
// 只返回较长的一边,因为路径只允许从一个方向延伸
return Math.max(leftPath, rightPath);
}
dfs(root); // 从根节点开始进行DFS
return res; // 返回计算出的最大同值路径长度
};