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},

   / \

    /  \
      

return its level order traversal as:

[
[],
[,],
[,]
]

题解:二叉树的层次遍历,用队列实现。重点在于如何判断每一层的结束和下一层的开始。

用一个变量nextLevelStarter记录下一层的开始节点,最初为root的左子或者右子(如果左子为空),每一层遍历开始的时候赋值为null。在遍历这一层时,观察当前遍历节点的左子和右子,如果nextLevelStarter当前为空,且当前节点的左子不为空,那么说明当前节点的左子是下一层的第一个节点,就把当前节点的左子赋值给nextLevelStarter;如果左子为空,再看右子。如果当前节点的左右子都为空,那么nextLevelStarter应该是当前节点这一层后面的节点的孩子,就继续遍历当前这一层。以上面的例子说明,遍历第二层时从9开始,发现9的左子和右子都为空,那么nextLevelStarter就保持为null,遍历到20的时候,发现20的左子不为空,那么就把nextLevelStarter赋值为20的左子,即下一层的第一个节点。这时候nextLevelStarter已经不为空了,那么即使20后面还有节点,也不会改变nextLevelStarter的值了。

代码如下:

 public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> answerList = new ArrayList<List<Integer>>();
TreeNode nextLevelStarter;
Queue<TreeNode> q = new LinkedList<TreeNode>(); q.add(root);
if(root != null){
if(root.left != null)
nextLevelStarter = root.left;
else if(root.right != null)
nextLevelStarter = root.right;
else {
List<Integer> temp = new ArrayList<Integer>();
temp.add(root.val);
answerList.add(temp);
return answerList;
}
}
else
return answerList; while(!q.isEmpty()){ TreeNode currentNode = q.peek();
List<Integer> thisLevelList = new ArrayList<Integer>();
//每层遍历开始的时候把nextLevelStarter赋值为null,遍历这一层的时候顺便找下一层的开始节点
nextLevelStarter = null; //没有到达下一层的开始节点时继续遍历
while(q.peek() != nextLevelStarter && q.isEmpty() == false){
currentNode = q.remove(); //如果nextLevelStarter值为空,说明还没找到下一层的起始节点
//那么就查看当前遍历的节点的孩子是否为空,不为空就是下一层的起始节点
if(nextLevelStarter == null){
if(currentNode.left != null)
nextLevelStarter = currentNode.left;
else {
if(currentNode.right != null){
nextLevelStarter = currentNode.right;
}
}
} thisLevelList.add(currentNode.val);
if(currentNode.left != null)
q.add(currentNode.left);
if(currentNode.right != null)
q.add(currentNode.right);
} answerList.add(thisLevelList);
}
return answerList;
}
}

还要积累一下java中队列的使用方法:

1.声明和初始化:

Queue<TreeNode> q = new LinkedList<TreeNode>();

2.add()函数:往队列中加入一个值

3.peek()函数:返回队列头但不删除队列头

4.remove()函数:返回队列头并且删除队列头

java中声明二维列表的方法:

List<List<Integer>> answerList = new ArrayList<List<Integer>>();

做这道题的时候还遇到一个问题,就是开始时候想在每一层结束后把存放当前层节点信息的列表thisLevelList加入到answerList这个二维列表后就把thisLevelList清空,就不用在每层开始遍历的时候都要声明thisLevelList了,后来发现这种方法不可行,因为把thisLevelList清空后answerList里面加入的thisLevelList的值也没有了,想了一下原因应该是每次声明thisLevelList的时候都开辟了一块内存,当把thisLevelList加入answerList的时候,answerList直接设置一个指针指向这块内存,所以如果把这块内存清空,answerList里面指向的值就对应请空了。所以在遍历每一层的时候都要申请新的内存空间存放当前这一层节点的值。

说好半个小时写完的,高估自己了,碎觉~

【leetcode刷题笔记】Binary Tree Level Order Traversal(JAVA)的更多相关文章

  1. [刷题] 102 Binary Tree Level Order Traversal

    要求 对二叉树进行层序遍历 实现 返回结果为双重向量,对应树的每层元素 队列的每个元素是一个pair对,存树节点和其所在的层信息 1 Definition for a binary tree node ...

  2. LeetCode(107) Binary Tree Level Order Traversal II

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

  3. LeetCode之“树”:Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal 题目链接 题目要求: Given a binary tree, return the level order traversal o ...

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

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

  5. leetcode 102 Binary Tree Level Order Traversal ----- java

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

  6. LeetCode(26)-Binary Tree Level Order Traversal II

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

  7. [LeetCode&Python] Problem 107. Binary Tree Level Order Traversal II

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

  8. LeetCode(102) Binary Tree Level Order Traversal

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

  9. Binary Tree Level Order Traversal java实现

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

随机推荐

  1. Android 应用程序分析

    从这点上看,android应用程序实际上是由多个Activity按照一定的次序拼装起来的, 只不过拼装的过程中,后台传递了一些数据,使得各个Activity之间能比较好的衔接起来.     在 and ...

  2. NSNotification的几点说明

    1.NSNotification消息的同步性 ①NSNotification使用的是同步操作.即如果你在程序中的A位置post了一个NSNotification,在B位置注册了一个observer,通 ...

  3. Mysql查询结果只有一条的情况下把值赋值给变量,再用if else 流程判断

    BEGIN set @n=(SELECT count(day) from log where day=CURDATE()); THEN call m_LogInsert(); ELSE call m_ ...

  4. 面向对象-Object类

    一.Object类中的equals()方法 equals(Object obj) :指示其它某个对象是否与此对象"相等". 返回值类型是boolean Oblect类中的equal ...

  5. Qemu线程池介绍

    有时我们希望把一部分工作通过创建线程的方式异步执行,这样我们可以在执行任务的同时,继续执行其他任务.但是如果这种需求比较多的话,频繁的创建和销毁线程带来很大的性能损耗.如果我们能创建一个或一些线程,然 ...

  6. WAS集群系列(3):集群搭建:步骤1:准备文件

    说明:"指示轨迹"为"点选顺序",截图为点击后效果截图 环境 项目点 指标 WAS版本号 7.0 操作系统 Windows 2008 系统位数 64bit 内存 ...

  7. CoreAnimation的使用小结

    參考:http://www.cnblogs.com/wendingding/p/3801157.htmlhttp://www.cnblogs.com/wendingding/p/3802830.htm ...

  8. EularProject 39:给周长推断构成直角三角形个数

    华电北风吹 天津大学认知计算与应用重点实验室 完毕日期:2015/7/30 Integer right triangles Problem 39 If p is the perimeter of a ...

  9. SpringBoot Idea 启动报错 Process finished with exit code 1

    问题描述:没有其他任何错误日志,只有Process finished with exit code 1 问题原因:Maven POM.xml问题造成 由于是properties是我直接从其他项目中拷贝 ...

  10. OpenResty — Nginx全能插件版

    官网: http://openresty.org/ 虽然是中国人做的,但没几个汉字..... 我用Nginx,是这样一个过程: 1. 系统rpm中的nginx,能让其跑起来 2. 玩配置文件 3. 玩 ...