[路飞] 最长同值路径

102 阅读1分钟

记录 1 道算法题

最长同值路径

leetcode-cn.com/problems/lo…


要求: 提供一个二叉树,返回节点值相同的路径,路径只能往一个方向走,不能重复走节点。返回节点的路径(节点数 - 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
    }