本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41929059

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

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

思路:

(1)题意为给定一颗二叉树,按层次输出每层对应的值。

(2)本文主要运用队列来操作树中每层节点。为了避免每次从根节点开始遍历,在我们对地第m层进行访问时,只需知道m-1层节点信息即可,这样就无需每次都从根节点开始访问,从而可以提高效率。

(3)这里设置两个标记位first和last来记录当前层待访问的节点位置和当前层最后一个节点的下一个节点的位置。

(4)解题思路大致为:如果根节点不为空,将根节点加入当前队列,初始化标记位first为0,即为当前队列中待访问的第一个节点,初始化标记位last为1,即为当前队列中元素个数。如果first小于队列大小,即在队列中对应在first位置的节点存在,则进入循环准备遍历第一层元素,last指向队列中最后一个元素的下一个位置,如果first<last,说明该层还有元素未被访问,将first位置对应的节点存入临时存储每层节点的链表中,如果该位置的左右节点不为空,则分别将左右节点存入当前链表中,已经遍历完一个节点,此时first++,即指向下一个待遍历的节点,循环直到first==last,说明当前层节点全部遍历完,将临时链表存入待输出的队列中;然后接着遍历第二层,依次类推,直到遍历到最后一层最后一个节点时,此时last等于当前队列元素个数,跳出循环,返回结果。

(5)对于题目中的示例,下面给出其执行过程:

A:将根节点3加入当前队列all中,初始化first=0,last=1

B:由于first<all.size()=1,说明first所对应位置在all中存有节点,此时last执行all最后一个节点3所在位置0的下一个位置1

C:由于first<last,当前层未遍历,取出first所对元素3存入临时链表level中,继续看该节点的下层孩子节点,即其左右节点是否为空

D:不为空则将9和20加入队列,此时,first所指元素已遍历完,first指向下一个元素,first++,此时first=last,说明第一层遍历完了

E:接着遍历第二层,第二层开始位置为1,即从节点9开始遍历,......

F:这里需要注意的是:每遍历到一个节点,将其左右节点加入队列的顺序必须为先左后右,这样才能保证输出顺序的正确性。

(6)本文主要考察对队列的应用,特别是其“先进先出”的特性,能够保证每层都是按照从左到右的顺序输出。

(7)希望本文对你有所帮助。谢谢。

算法代码实现如下所示:

public static List<List<Integer>> levelOrder(TreeNode root) {
	List<List<Integer>> result = new LinkedList<List<Integer>>();
	//注意root为空时不能返回null
	if (root == null)
		return result;

	List<TreeNode> all = new LinkedList<TreeNode>();
	all.add(root);
	int first = 0; //当前待访问节点,初始为第一个节点,即根节点
	int last = 1; //当前链表中元素个数,初始只有一个
	while (first < all.size()) {  //如果待访问节点存在于链表
		last = all.size();      //下一行访问开始,定位last为当前行最后一个节点下一个节点所在位置
		List<Integer> level = new LinkedList<Integer>();
		while (first < last) {    //如果first==last表示该行所有节点都被访问到了,跳出循环
			level.add(all.get(first).val);
			if (all.get(first).left != null) {
				all.add(all.get(first).left);
			}
			if (all.get(first).right != null) {
				all.add(all.get(first).right);
			}
			first++; //每访问完一个节点就指向下一个节点
		}
		result.add(level);
	}
	return result;
}

Leetcode_102_Binary Tree Level Order Traversal的更多相关文章

  1. [LeetCode] Binary Tree Level Order Traversal II 二叉树层序遍历之二

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  2. [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  3. 【leetcode】Binary Tree Level Order Traversal I & II

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  4. LeetCode之Binary Tree Level Order Traversal 层序遍历二叉树

    Binary Tree Level Order Traversal 题目描述: Given a binary tree, return the level order traversal of its ...

  5. 35. Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal OJ: https://oj.leetcode.com/problems/binary-tree-level-order-trave ...

  6. LeetCode:Binary Tree Level Order Traversal I II

    LeetCode:Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of ...

  7. 【Binary Tree Level Order Traversal II 】cpp

    题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...

  8. lettcode-102:Binary Tree Level Order Traversal (Java)

    Binary Tree Level Order Traversal 二叉树的层序遍历 两种方式: 1.用两个queue交替表示每一层的节点 2.用两个node,一个表示当前层的最后一个节点,一个表示下 ...

  9. leecode 每日解题思路 102-Binary Tree Level Order Traversal

    題目描述: 题目链接: 102-Binary Tree Level Order Traversal 这个问题要解决的是如何逐层遍历一个二叉树,并把同一层元素放入同一list中, 再将所有元素返回. 其 ...

随机推荐

  1. 安利三款提升幸福感的chrome插件

    谷歌访问助手 chrome浏览器一直是各大码农推荐的比较好用的浏览器,速度快.插件多. 但是由于众所周知的原因导致了谷歌账号同步.扩展商店访问慢甚至打不开的情况. 谷歌访问助手就是用来解决此问题的. ...

  2. 解决使用BottomSheetDialog时状态栏变黑的问题

    问题描述 当使用support里的design 库里的BottomSheetDialog时,在6.0的机器上当对话框弹出时系统状态栏会变黑,如下图所示: 一开始以为是我用的姿势不对,试过对style配 ...

  3. 分布式一致性协议Raft原理与实例

    分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...

  4. Java Web前端到后台常用框架介绍

    一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...

  5. springMVC源码分析--AbstractHandlerMapping(二)

    上一篇博客springMVC源码分析--HandlerMapping(一)中我们简单的介绍了HandlerMapping,接下来我们介绍一下它的抽象实现类AbstractHandlerMapping

  6. C++:如何删除string对象的末尾非数字字符

    功能实现: 现有一个string对象包含数字字符以及非数字字符,实现删除string对象的末尾非数字字符. 实例: 输入为"0 1 1 2 3    " 输出为"0 1 ...

  7. [Flask]学习杂记--模板

    这个学习杂记主要不是分享经验,更多是记录下falsk的体验过程,以后做东西在深入研究,因为django之前用的时间比较长,所以很多概念都是一看而过,做个试验了解下flask的功能. flask中使用是 ...

  8. SVN与eclipse整合与使用、SVN与Apache整合

    SVN与eclipse整合 下载SVN插件(http://subclipse.tigris.org) http://subclipse.tigris.org/servlets/ProjectDocum ...

  9. SQL Server 执行计划操作符详解(3)——计算标量(Compute Scalar)

    接上文:SQL Server 执行计划操作符详解(2)--串联(Concatenation ) 前言: 前面两篇文章介绍了关于串联(Concatenation)和断言(Assert)操作符,本文介绍第 ...

  10. Hadoop与分布式数据处理 Spark VS Hadoop有哪些异同点?

    Spark是一个开源的通用并行分布式计算框架,由加州大学伯克利分校的AMP实验室开发,支持内存计算.多迭代批量处理.即席查询.流处理和图计算等多种范式.Spark内存计算框架适合各种迭代算法和交互式数 ...