leetcode 145. 二叉树的后序遍历

117 阅读1分钟

力扣题目链接

给定一个二叉树,返回它的后序遍历。

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

迭代实现(提交通过)

import "container/list"

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func postorderTraversal(root *TreeNode) []int {
    if root == nil {
        return nil
    }
    var (
        res []int
        prev = root
        sk = NewStack()
    )
    sk.Push(root)
    for !sk.IsEmpty() {
        node := sk.Peek().(*TreeNode)
        if node.Left != nil && node.Left != prev && node.Right != prev {
            sk.Push(node.Left)
        } else if node.Right != nil && node.Right != prev {
            sk.Push(node.Right)
        } else {
            sk.Pop()
            res = append(res, node.Val)
            prev = node
        }
    }
    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 postorderTraversal(root *TreeNode) []int {
    return postorder(root, nil)
}

func postorder(root *TreeNode, res []int) []int {
    if root == nil {
        return nil
    }
    if root.Left != nil {
        res = postorder(root.Left, res) // 左
    }
    if root.Right != nil {
        res = postorder(root.Right, res) // 右
    }
    res = append(res, root.Val) // 根
    return res
}