leetcode 94. 二叉树的中序遍历

102 阅读1分钟

力扣题目链接

给定一个二叉树的根节点 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
}