记录 1 道算法题
最长同值路径
要求: 提供一个二叉树,返回节点值相同的路径,路径只能往一个方向走,不能重复走节点。返回节点的路径(节点数 - 1),比如: [5,4,5,1,1,5],得到 2。
我们可以进行递归,将每一个子节点的路径值返回上来。像计算二叉树高度那样。将子节点和自己比较,如果相同则路径 +1,如果不同则返回 0 或者 1 ,取决于返回值是节点数还是边数。
function longestUnivaluePath(root) {
// 空节点 0 条边
if (!root) return
// 最大边数量
let max = 0
const dfs = (node) => {
// 设置默认值,因为可能是叶子节点
let l = 0,r = 0
if (node.left) {
// 如果左子节点存在,就递归,返回路径数量
const a = dfs(node.left)
// 如果和当前节点值一样,路径 + 1
if (node.left.val === node.val) {
l += a + 1
}
}
if (node.right) {
// 如果右子节点存在,就递归,返回路径数量
const a = dfs(node.right)
// 如果和当前节点值一样,路径 + 1
if (node.right.val === node.val) {
l += a + 1
}
}
// 有可能是最大的边是以这个节点为根节点,保存最大的路径数量。
max = Math.max(l + r, max)
// 返回当前的边数,如果有相等的子节点,就继承。没有就是 0
return Math.max(l, r)
}
dfs(root)
return max
}