leetcode 144. 二叉树的前序遍历

157 阅读1分钟

力扣题目链接

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