题目:
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
}