前中后三种遍历
const (
preorder = int32(iota)
inorder
postorder
)
func traverse(root *TreeNode, order int32) (ans []int) {
stack := make([]*TreeNode, 0)
var pushLeft func(root *TreeNode)
pushLeft = func(root *TreeNode) {
for root != nil {
if order == preorder {
ans = append(ans, root.Val)
}
stack = append(stack, root)
root = root.Left
}
}
visited := &TreeNode{}
pushLeft(root)
for len(stack) > 0 {
cur := stack[len(stack)-1]
if (cur.Left == nil || cur.Left == visited) && cur.Right != visited {
if order == inorder {
ans = append(ans, cur.Val)
}
pushLeft(cur.Right)
}
if cur.Right == nil || cur.Right == visited {
visited = cur
if order == postorder {
ans = append(ans, cur.Val)
}
stack = stack[:len(stack)-1]
}
}
return ans
}
层序遍历
func bfs(root *TreeNode) (ans []int) {
if root == nil {
return ans
}
queue := make([]*TreeNode, 0)
queue = append(queue, root)
for len(queue) > 0 {
sz := len(queue)
for i := 0; i < sz; i++ {
q := queue[0]
queue = queue[1:]
ans = append(ans, q.Val)
if q.Left != nil {
queue = append(queue, q.Left)
}
if q.Right != nil {
queue = append(queue, q.Right)
}
}
}
return ans
}
# 用栈模拟递归迭代遍历二叉树