1372. 二叉树中的最长交错路径

80 阅读1分钟

题目:
leetcode.cn/problems/lo…
算法:
方法一:DFS

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func longestZigZag(root *TreeNode) int {
    var dfs func(flag, size int, node *TreeNode) 
    ans := 0
    dfs = func(flag, size int, node *TreeNode)  {
        if node == nil  {
            return 
        }

        ans = max(ans, size)
        if flag == 0 {
            dfs(1, size + 1, node.Left)
            dfs(0, 1, node.Left)
        } else {
            dfs(0, size + 1, node.Right)
            dfs(1, 1, node.Right)
        }
    }
    dfs(0, 1, root)
    dfs(1, 1, root)
    return ans - 1
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

方法二:树形DP

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func longestZigZag(root *TreeNode) int {
    var dfs func(node *TreeNode) (lZigZag, rZigZag int)
    ans := 0
    dfs = func(node *TreeNode) (lZigZag, rZigZag int) {
        if node == nil {
            return 0, 0
        }
        _, r1 := dfs(node.Left)
        l2, _ := dfs(node.Right)
        if node.Left != nil {
            lZigZag = r1 + 1
        }
        if node.Right != nil {
            rZigZag = l2  +1
        }
        
        ans = max(max(ans, lZigZag), rZigZag)
        return
    }
    dfs( root)
    return ans
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}