leetcode 102. 二叉树的层序遍历

178 阅读1分钟

力扣题目链接

给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)。

也就是返回一个二维数组。

实现(迭代,提交通过)

import "container/list"

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func levelOrder(root *TreeNode) [][]int {
    if root == nil {
        return nil
    }
    var (
        res [][]int
        q = NewQueue()
    )
    q.Push(root)
    for !q.IsEmpty() {
        c := q.Len()
        level := make([]int, 0, c)
        for i := 0; i < c; i++ {
            node := q.Pop().(*TreeNode)
            level = append(level, node.Val)
            if node.Left != nil {
                q.Push(node.Left)
            }
            if node.Right != nil {
                q.Push(node.Right)
            }
        }
        res = append(res, level)
    }
    return res
}

type Queue struct {
	l *list.List
}

func NewQueue() *Queue {
	return &Queue{
		l: list.New(),
	}
}

func (o *Queue) Push(v interface{}) {
	o.l.PushBack(v)
}

func (o *Queue) Pop() interface{} {
	if o.IsEmpty() {
		panic("Queue is empty")
	}
	e := o.l.Front()
	o.l.Remove(e)
	return e.Value
}

func (o *Queue) Front() interface{} {
	if o.IsEmpty() {
		panic("Queue is empty")
	}
	return o.l.Front().Value
}

func (o *Queue) Back() interface{} {
	if o.IsEmpty() {
		panic("Queue is empty")
	}
	return o.l.Back().Value
}

func (o *Queue) IsEmpty() bool {
	return o.l.Len() == 0
}

func (o *Queue) Len() int {
	return o.l.Len()
}