golang--算法--二叉树的层序遍历

前言:

数据结构与算法学习方法个人梳理:

  1. 系统梳理所有知识点,并形成知识树体系,达到每个知识点有理论支撑,并清楚知识点间的关联;
  2. 反复练习至少5遍,时间间隔1天+(参考极客时间覃超老师教的方法);
  3. 有目的的、刻意的、反复的进行练习,感受到枯燥、难受、不爽均为正常现象,不用怀疑自己的智商,坚持以运用为出发点,达到熟练一题多解的程度,并知其然每一种的解法的时空复杂度分析;

题目描述:

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

示例:
二叉树:[3,9,20,null,null,15,7],

   3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

解题方法:

思路:结合队列,每层由左至右先进先出 解题。

解题1:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var res [][]int

func levelOrder(root *TreeNode) [][]int {
	res = [][]int{}
	dfs(root, 0)
	return res
}

func dfs(root *TreeNode, level int) {
	if root != nil {
		if len(res) == level {
			res = append(res, []int{})
		}
		res[level] = append(res[level], root.Val)
		dfs(root.Left, level+1)
		dfs(root.Right, level+1)
	}
}

 解题2:

func levelOrder(root *TreeNode) [][]int {
	res := [][]int{}
    if root == nil{
        return res
    }
	var queue = []*TreeNode{root}
	var level int
	for len(queue) > 0 {
		counter := len(queue)
        res = append(res,[]int{})
		for 0 < counter {
			counter--
			if queue[0].Left != nil {
				queue = append(queue, queue[0].Left)
			}
			if queue[0].Right != nil {
				queue = append(queue, queue[0].Right)
			}
			res[level] = append(res[level], queue[0].Val)
			queue = queue[1:]
		}
		level++
	}
	return res
}

效果对比:

golang--算法--二叉树的层序遍历_第1张图片

你可能感兴趣的:(常见算法golang实现集合)