leetcode102 电话号码的字母组合

leetcode102 Binary Tree Level Order Traversal

Posted by BY on October 29, 2018

前言

博客好久没更新了,10月的末尾来水一篇。

正文

问题来源

本问题来自leetcode上的102题。

问题描述

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],

  3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

分析:

本人写的非递归Go代码如下:

func levelOrder(root *TreeNode) [][]int {
        if nil == root {
                return nil
        }       
        ret := make([][]int, 0)
        queue := make([]*TreeNode, 0)
        queueTemp := make([]*TreeNode, 0)
        queue = append(queue, root)
        for 0 != len(queue) {
                rowTemp := make([]int, 0)//清空
                for i := 0; i < len(queue); i++ {
                        ele := queue[i]
                        rowTemp = append(rowTemp, ele.Val)
                        if nil != ele.Left {
                                queueTemp = append(queueTemp, ele.Left)
                        }       
                        if nil != ele.Right {
                                queueTemp = append(queueTemp, ele.Right)
                        }       
                }
                ret = append(ret, rowTemp)
                queue = queueTemp
                queueTemp = make([]*TreeNode, 0)
        }
        return ret
}

网上效率高的递归代码

func levelOrder(root *TreeNode) [][]int {
	return levelOrderBy(root, 0, nil)
}

func levelOrderBy(root *TreeNode, level int, resu [][]int) [][]int {
	if root == nil {
		return resu
	}

	if off := level - len(resu); off >= 0 {
		resu = append(resu, make([][]int, off+1)...)
	}

	resu[level] = append(resu[level], root.Val)
	resu = levelOrderBy(root.Left, level+1, resu)
	resu = levelOrderBy(root.Right, level+1, resu)
	return resu
}

总结:

继续思考优化方案

结语

不要懒,多看多写。