给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
进阶:递归算法很简单,你可以通过迭代算法完成吗?
迭代实现(提交通过)
import "container/list"
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func preorderTraversal(root *TreeNode) []int {
if root == nil {
return nil
}
sk := NewStack()
sk.Push(root)
var res []int
for !sk.IsEmpty() {
node := sk.Peek().(*TreeNode)
sk.Pop()
res = append(res, node.Val)
if node.Right != nil {
sk.Push(node.Right)
}
if node.Left != nil {
sk.Push(node.Left)
}
}
return res
}
type Stack struct {
l *list.List
}
func NewStack() *Stack {
return &Stack{
l: list.New(),
}
}
func (o *Stack) Push(v interface{}) {
o.l.PushBack(v)
}
func (o *Stack) Peek() interface{} {
if o.IsEmpty() {
panic("Stack is empty")
}
return o.l.Back().Value
}
func (o *Stack) Pop() {
if o.IsEmpty() {
panic("Stack is empty")
}
o.l.Remove(o.l.Back())
}
func (o *Stack) IsEmpty() bool {
return o.l.Len() == 0
}
func (o *Stack) Len() int {
return o.l.Len()
}
递归实现(提交通过)
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func preorderTraversal(root *TreeNode) []int {
return preorder(root, nil)
}
func preorder(root *TreeNode, res []int) []int {
if root == nil {
return nil
}
res = append(res, root.Val) // 前
if root.Left != nil {
res = preorder(root.Left, res) // 左
}
if root.Right != nil {
res = preorder(root.Right, res) // 右
}
return res
}