Binary Tree Zigzag Level Order Traversal
题目描述
二叉树的锯齿形层序遍历:
给定一个二叉树,返回其节点值的锯齿形层序遍历。
即先从左向右遍历,再从右往左进行下一层遍历。
示例:
输入:[3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
输出:[
[3],
[20,9],
[15,7]
]
解法
二叉树节点的定义为:
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
解法一:广度优先遍历
时间复杂度:
O(N)
空间复杂度:
O(N)
func zigzagLevelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
desc := false
ans := [][]int{}
stack := []*TreeNode{root}
for len(stack) > 0 {
cur := []int{}
n := len(stack)
for i := n - 1; i >= 0; i-- {
node := stack[i]
cur = append(cur, node.Val)
if !desc { // 顺序
if node.Left != nil {
stack = append(stack, node.Left)
}
if node.Right != nil {
stack = append(stack, node.Right)
}
} else { // 倒序
if node.Right != nil {
stack = append(stack, node.Right)
}
if node.Left != nil {
stack = append(stack, node.Left)
}
}
}
stack = stack[n:]
ans = append(ans, cur)
desc = !desc
}
return ans
}
解法二:深度优先遍历
时间复杂度:
O(N)
空间复杂度:
O(N)
func zigzagLevelOrder(root *TreeNode) [][]int {
ans := [][]int{}
return dfs(root, 1, ans)
}
func dfs(root *TreeNode, layer int, ans [][]int) [][]int {
if root == nil {
return ans
}
if len(ans) < layer {
ans = append(ans, []int{})
}
if layer&1 == 1 {
ans[layer-1] = append(ans[layer-1], root.Val)
} else {
ans[layer-1] = append([]int{root.Val}, ans[layer-1]...)
}
ans = dfs(root.Left, layer+1, ans)
ans = dfs(root.Right, layer+1, ans)
return ans
}
Last updated
Was this helpful?