锯齿遍历(又称之为“之字形遍历”或“层次遍历”)是二叉树的一种遍历方式,其特点是每一层的节点在遍历时交替方向:奇数层从左到右,偶数层从右到左。以下是实现锯齿遍历的步骤和示例代码。
锯齿遍历步骤
- 使用一个队列来辅助层次遍历。
- 使用一个布尔值来标记当前层的遍历方向。
- 按照层次遍历的顺序,依次将节点加入到结果列表中,根据当前层的遍历方向来决定顺序。
示例代码(Go)
package main
import (
"fmt"
)
type TreeNode struct {
Value int
Left *TreeNode
Right *TreeNode
}
// 锯齿遍历函数
func zigzagLevelOrder(root *TreeNode) [][]int {
if root == nil {
return [][]int{}
}
var result [][]int
currentLevel := []*TreeNode{root}
leftToRight := true
for len(currentLevel) > 0 {
var levelValues []int
nextLevel := []*TreeNode{}
for i := len(currentLevel) - 1; i >= 0; i-- {
node := currentLevel[i]
if leftToRight {
levelValues = append(levelValues, node.Value)
} else {
levelValues = append([]int{node.Value}, levelValues...)
}
if node.Left != nil {
nextLevel = append(nextLevel, node.Left)
}
if node.Right != nil {
nextLevel = append(nextLevel, node.Right)
}
}
result = append(result, levelValues)
currentLevel = nextLevel
leftToRight = !leftToRight // 切换方向
}
return result
}
func main() {
// 构建二叉树
root := &TreeNode{Value: 1}
root.Left = &TreeNode{Value: 2}
root.Right = &TreeNode{Value: 3}
root.Left.Left = &TreeNode{Value: 4}
root.Left.Right = &TreeNode{Value: 5}
root.Right.Left = &TreeNode{Value: 6}
root.Right.Right = &TreeNode{Value: 7}
// 执行锯齿遍历
result := zigzagLevelOrder(root)
for _, level := range result {
fmt.Println(level)
}
}输出结果
对于以下树结构:
1
/ \
2 3
/ \ / \
4 5 6 7
锯齿遍历的输出将会是:
[1]
[3 2]
[4 5 6 7]
总结
锯齿遍历通过交替的层次访问顺序,展现了树的节点,适用于需要层次和方向的遍历场景。如果有更多问题或需要进一步的示例,请告诉我!