leetcode429 N叉树的层序遍历

leetcode 429 N-ary Tree Level Order Traversal

Posted by BY on May 22, 2021

前言

持续更新了

正文

问题来源

本问题来自leetcode上的429题。
最近工作压力有点大,早上起来做道题解解压。

问题描述

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

分析:

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Children []*Node
 * }
 */

func levelOrder(root *Node) [][]int {
    if root == nil {
        return nil
    }
    queue := []*Node{root}
    next := []*Node{}
    ret := [][]int{}
    row := []int{}
    for len(queue) > 0 {
        cur := queue[0]
        queue = queue[1:]
        row = append(row, cur.Val)
        for i := 0; i < len(cur.Children); i++ {
            next = append(next, cur.Children[i])
        }
        if len(queue) == 0 {
            queue = next
            next = []*Node{}
            ret = append(ret, row)
            row = []int{}
        }
    }
    return ret
}

别人的做法

func levelOrder(root *Node) [][]int {
    if root == nil {
        return [][]int{}
    }

    queue := []*Node{}
    queue = append(queue,root) 
    ans := [][]int{}    
    for len(queue) > 0 {
        l := len(queue)
        temp := []int{}
        for i := 0; i < l; i++ {
            node := queue[0]
            queue = queue[1:]
            temp = append(temp,node.Val)
            for j := 0; j < len(node.Children); j++ {
                queue = append(queue,node.Children[j])
            }
            
        }
        ans = append(ans,temp)
    }
    return ans
}

递归解法

func traverse(root *Node,ans *[][]int,level int) {
    if root == nil {
        return
    }

    if len(*ans) - 1 < level {
        *ans = append(*ans,[]int{})
    }

    (*ans)[level] = append((*ans)[level],root.Val)

    for i := 0; i < len(root.Children); i++ {
        traverse(root.Children[i],ans,level + 1)
    }
}

func levelOrder1(root *Node) [][]int {
    ans := [][]int{}
    traverse(root,&ans,0)
    return ans
}

总结:

勤思考。

结语

不管怎么样好好加油。