给定一个二叉树的根节点 root ,返回它的中序遍历。
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
迭代实现(提交通过)
import "container/list"
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func inorderTraversal(root *TreeNode) []int {
if root == nil {
return nil
}
var (
res []int
curr = root
sk = NewStack()
)
for {
if curr != nil {
sk.Push(curr)
curr = curr.Left
} else if !sk.IsEmpty() {
node := sk.Peek().(*TreeNode)
sk.Pop()
res = append(res, node.Val)
curr = node.Right
} else {
break
}
}
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 inorderTraversal(root *TreeNode) []int {
return inorder(root, nil)
}
func inorder(root *TreeNode, res []int) []int {
if root == nil {
return nil
}
if root.Left != nil {
res = inorder(root.Left, res)
}
res = append(res, root.Val)
if root.Right != nil {
res = inorder(root.Right, res)
}
return res
}