本文是在学习中的总结,欢迎转载但请注明出处: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. Python中迭代输出(index,value)的几种方法

    需求如下:迭代输出序列的索引(index)和索引值(value). 1.创建测试列表: >>> lst = [1,2,3,4,5] 2.实现方法如下: #方法1:range()+le ...

  2. Pickle模块数据对象持久化操作

    Pickle模块的作用是持久化(序列化)的储存数据.因此我先解释下:什么是序列化与反序列化.什么是对象序列化和对象反序列化.通俗地讲,它们的定义如下:序列化: 把一个对象保存到一个文件或数据库字段中去 ...

  3. windows资源管理器中配置右键bash here

    windows下安装了git后有git bash here 但是安装了cygwin没有bash here 我们可以通过修改注册表的方式自己做一个 Win10下在注册表内有一般有两个默认的 cmd 和 ...

  4. Hibernate异常之cascade

    org.hibernate.MappingException: Unsupported cascade style: delete-option at org.hibernate.engine.spi ...

  5. Python3 错误和异常

    Python有两种错误很容易辨认:语法错误和异常. 语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 >>> while True print('He ...

  6. 自定义一个仿Spinner

    两个布局文件: adpter_list.xml <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  7. Spark:聚类算法

    Spark:聚类算法 Kmeans聚类 KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇.然后按平均法重新计算各个簇的质心,从而确定新的簇心.一直迭代,直到簇 ...

  8. 微信小程序实例-摇一摇抽奖

    概述 前面我们讲了如何开始微信小程序搭建和一些组件的介绍.微信小组件和微信小程序入门 微信小程序目录 为了更好的理解小程序和小程序开发,我们首先来看一下项目的目录. 首先看下根目录下的app.json ...

  9. PHP 针对多用户 实现头像更换

    成品图 思路 登陆页面 表单制作 验证码制作 JavaScript刷新验证码 验证页面 验证逻辑 页面跳转 header函数 Meta标签 JavaScript 上传页面 个人主页 上传核心 最终结果 ...

  10. Python 函数参数传递机制.

    learning python,5e中讲到.Python的函数参数传递机制是对象引用. Arguments are passed by assignment (object reference). I ...