题目:

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]
]

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

链接: http://leetcode.com/problems/binary-tree-level-order-traversal/

题解:

层序遍历二叉树。使用BFS, 用一个Queue来辅助存储当前层的节点。

Time Complexity - O(n), Space Complexity - O(n) (最多一层节点数)

public class Solution {
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(root == null)
return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
ArrayList<Integer> list = new ArrayList<Integer>();
queue.add(root);
int curLevel = 1, nextLevel = 0; while(!queue.isEmpty()){
TreeNode node = queue.poll();
curLevel --;
list.add(node.val); if(node.left != null){
queue.offer(node.left);
nextLevel ++;
}
if(node.right != null){
queue.offer(node.right);
nextLevel ++;
}
if(curLevel == 0){
curLevel = nextLevel;
nextLevel = 0;
result.add(new ArrayList<Integer>(list));
list.clear();
}
} return result;
}
}

Update:

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null)
return res;
Queue<TreeNode> queue = new LinkedList<>(); //BFS
ArrayList<Integer> list = new ArrayList<>();
queue.add(root); //Initialize
int curLevel = 1, nextLevel = 0; while(!queue.isEmpty()) {
TreeNode node = queue.poll();
list.add(node.val);
curLevel --;
if(node.left != null) {
queue.offer(node.left);
nextLevel++;
}
if(node.right != null) {
queue.offer(node.right);
nextLevel++;
}
if(curLevel == 0) {
curLevel = nextLevel;
nextLevel = 0;
res.add(new ArrayList<Integer>(list));
list.clear();
}
} return res;
}
}

二刷:

使用一个queue来帮助BFS层序遍历,有两个记录当前层节点和下一层节点数的变量curLevel以及nextLevel。

Java:

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
int curLevel = 1, nextLevel = 0;
List<Integer> list = new ArrayList<>();
while (!q.isEmpty()) {
TreeNode node = q.poll();
curLevel--;
list.add(node.val);
if (node.left != null) {
q.offer(node.left);
nextLevel++;
}
if (node.right != null) {
q.offer(node.right);
nextLevel++;
}
if (curLevel == 0) {
curLevel = nextLevel;
nextLevel = 0;
res.add(new ArrayList<Integer>(list));
list.clear();
}
}
return res;
}
}

三刷:

不要忘记把结果保存到结果集里,并且也要clear当前层。

Java:

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
List<Integer> level = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
int curLevel = 1, nextLevel = 0; while (!q.isEmpty()) {
TreeNode node = q.poll();
curLevel--;
level.add(node.val);
if (node.left != null) {
q.offer(node.left);
nextLevel++;
}
if (node.right != null) {
q.offer(node.right);
nextLevel++;
}
if (curLevel == 0) {
curLevel = nextLevel;
nextLevel = 0;
res.add(new ArrayList<Integer>(level));
level.clear();
}
}
return res;
}
}

Update: 换种写法

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
int curLevel = 1;
List<Integer> list = new ArrayList<>(); while (!q.isEmpty()) {
TreeNode node = q.poll();
curLevel--;
list.add(node.val);
if (node.left != null) q.offer(node.left);
if (node.right != null) q.offer(node.right);
if (curLevel == 0) {
curLevel = q.size();
res.add(new ArrayList<>(list));
list.clear();
}
} return res;
}
}

Reference:

https://leetcode.com/discuss/21778/java-solution-using-dfs

https://leetcode.com/discuss/22533/java-solution-with-a-queue-used

https://leetcode.com/discuss/58454/java-queue-solution-beats-100%25

102. Binary Tree Level Order Traversal的更多相关文章

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

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

  2. 102. 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】102. Binary Tree Level Order Traversal (2 solutions)

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

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

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

  5. leetcode 102. Binary Tree Level Order Traversal

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

  6. [LeetCode]题解(python):102 Binary Tree Level Order Traversal

    题目来源 https://leetcode.com/problems/binary-tree-level-order-traversal/ Given a binary tree, return th ...

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

  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 right, ...

  9. Java [Leetcode 102]Binary Tree Level Order Traversal

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

随机推荐

  1. 关于apache Alias斜杠/的实验

    1.Alias /icons/ "D:/wamp/bin/apache/Apache2.2.17/icons/" 访问http://localhost/icons/正常,访问htt ...

  2. Export功能 导致 页面显示很多非法字符,还可能页面显示两次

    private void exportBinaryToExcel(byte[] bytes, string filename) { Response.AddHeader("Content-D ...

  3. php入门变量之字符串

    字符串只是一块用引号括起来的字符:字母.数字.空格.标点符号,等等. 下面列出的全都是字符串: 'Huige' "In watermelon sugar" '100' 'Augus ...

  4. 用python实现了一下:甲乙两人互猜数字(数理逻辑)

    今天在园子里看到博客:超难面试题:甲乙两人互猜数字(数理逻辑).然后琢磨了半天,写了个Python程序实现算法,我得出来的结果是1,6或1,8或35,42的组合, 不知道是否正确,请高人指点? 下面列 ...

  5. KM3

    本科:读完一本书,知道book里讲的是什么,带有知识吸收: 硕士:读完一本书,知道book里的内容,而且还能发现相关的问题,带有知识的思考: 博士:读完一本书,知道book里的内容,而且还能发现相关的 ...

  6. sysfs接口函数到建立_DEVICE_ATTR

    sysfs接口函数到建立_DEVICE_ATTR 最近在弄Sensor驱动,看过一个某厂家的成品驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作. 说道s ...

  7. Hibernate从入门到精通(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...

  8. visio

    为您的产品密钥: 7DNWX-MRX4G-QCGX2-DG6BP-DC8RP   http://technet.microsoft.com/zh-cn/evalcenter/hh973399.aspx ...

  9. MBProgressHUD ---

    1,MBProgressHUD常用属性和用法Demo - (void)testMBProgressHUD { NSLog(@"test MBProgressHUD "); /* 要 ...

  10. 动态设置uitableview高度,参考

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { //  ...