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

层序遍历,既可以用dfs实现也可以用bfs实现,用bfs实现的时候应该借助队列,代码如下:

dfs:

 class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
dfs(root, );
return ret;
}
void dfs(TreeNode * root, int dep)
{
if(!root) return;
if(dep < ret.size()){
ret[dep].push_back(root->val);
}else{
vector<int> tmp;
tmp.push_back(root->val);
ret.push_back(tmp);
}
dfs(root->left, dep+);
dfs(root->right, dep+);
}
private:
vector<vector<int>> ret;
};

bfs:

 class Solution {
private:
struct Node{
TreeNode * treeNode;
int level;
Node(){}
Node(TreeNode * node, int lv)
:treeNode(node), level(lv){}
};
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<Node> nodeQueue;
vector<vector<int>> ret;
if(root == NULL)
return ret;
nodeQueue.push(Node(root, ));
int dep = -;
while(!nodeQueue.empty()){
Node node = nodeQueue.front();
if(node.treeNode->left)
nodeQueue.push(Node(node.treeNode->left, node.level + ));
if(node.treeNode->right)
nodeQueue.push(Node(node.treeNode->right, node.level + ));
if(dep == node.level)
ret[dep].push_back(node.treeNode->val);
else{
vector<int> tmp;
dep++;
ret.push_back(tmp);
ret[dep].push_back(node.treeNode->val);
}
nodeQueue.pop();
}
return ret;
}
};

java版本的如下所示,同样的包括dfs以及bfs:

 public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
dfs(ret, root);
return ret;
} public void dfs(List<List<Integer>> ret, int dep, TreeNode root){
if(root == null)
return;
if(dep < ret.size()){
ret.get(i).add(root.val);
}else{
List<Integer> tmp = new ArrayList<Integer>();
tmp.add(root.val);
ret.add(tmp);
}
dfs(ret, dep+1, root.left);
dfs(ret, dep+1, root.right);
}
}

下面的是bfs,稍微麻烦一点,需要自己再创造一个数据结构,代码如下:

 public class Solution {
public class Node{
int level;
TreeNode node;
Node(TreeNode n, int l){
level = l;
node = n;
}
}
public List<List<Integer>> levelOrder(TreeNode root) {
int dep = -1;
List<List<Integer>> ret = new ArrayList<List<Integer>>();
Queue<Node> queue = new LinkedList<Node>();
queue.add(new Node(root, 0));
while(!queue.isEmpty()){
Node n = queue.poll();
if(n.node == null) continue;
if(dep < n.level){
List<Integer> tmp = new ArrayList<Integer>();
tmp.add(n.node.val);
ret.add(tmp);
dep++;
}else{
ret.get(dep).add(n.node.val);
}
if(n.node.left != null) queue.add(new Node(n.node.left, n.level + 1));
if(n.node.right != null) queue.add(new Node(n.node.right, n.level + 1));
}
return ret;
}
}

LeetCode OJ:Binary Tree Level Order Traversal(二叉树的层序遍历)的更多相关文章

  1. leetcode 题解:Binary Tree Level Order Traversal (二叉树的层序遍历)

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

  2. 【LeetCode】102. Binary Tree Level Order Traversal 二叉树的层序遍历 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS DFS 日期 题目地址:https://lee ...

  3. LeetCode 102. Binary Tree Level Order Traversal 二叉树的层次遍历 C++

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

  4. leetcode 102.Binary Tree Level Order Traversal 二叉树的层次遍历

    基础为用队列实现二叉树的层序遍历,本题变体是分别存储某一层的元素,那么只要知道,每一层的元素都是上一层的子元素,那么只要在while循环里面加个for循环,将当前队列的值(即本层元素)全部访问后再执行 ...

  5. 【LeetCode】Binary Tree Level Order Traversal(二叉树的层次遍历)

    这道题是LeetCode里的第102道题. 题目要求: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15 ...

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

  7. [LeetCode] 314. Binary Tree Vertical Order Traversal 二叉树的垂直遍历

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  8. LeetCode 102. Binary Tree Level Order Traversal02. 二叉树的层次遍历 (C++)

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

  9. Binary Tree Level Order Traversal II(层序遍历2)

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

  10. Leetcode 102 Binary Tree Level Order Traversal 二叉树+BFS

    二叉树的层次遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ...

随机推荐

  1. Java并发—简介与线程创建

    程序.进程和线程 程序:一段静态的代码,一组指令的有序集合,不运行的话只是一堆代码. 程序并不能单独执行,只有将程序加载到内存中,系统为他分配资源后才能够执行,这种执行的程序称之为进程.也就是说进程是 ...

  2. (转)js原生自定义事件的触发dispatchEvent

    1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: 1 2 3 d ...

  3. Django——缓存机制

    1.缓存介绍 (1)概论 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台 ...

  4. Oracle处理Clob类型数据入库(String入库)

    从网上查找一堆参考,要么语焉不详,要么不可行.自己鼓捣了一堆可以正常入库了.请看最后: insert into CP_V_INFO" + "(ID, "+ "P ...

  5. rails 增删改查

    class InvoicesController < ApplicationController def index @invoices = Invoice.all end def show @ ...

  6. (转)【腾讯 TMQ】 接口测试用例设计

    导语 这是我在其他的开源社区看到的一篇分享帖子.这篇文章的目的只是为大家提供一个思路,但是实现成本太高了,因为一个接口设计的接口测试用例很多,一般公司的接口数量几百到上千不等,每一个接口都设计这么多测 ...

  7. UIPageControl修改圆点大小,根据View大小自适应

    遇到了个基本的控件问题,当设置UIPageControl的frame很小时,上面的小圆点会忽视view的frame而将圆点显示到控件外面. 但是如果想要设置小一点的圆点,或改变圆点间的间距,从而实现自 ...

  8. 转:C语言嵌入式系统编程之软件架构篇

    http://blog.csdn.net/ce123_zhouwei/article/details/6978672

  9. Python学习进程(6)函数

        函数最重要的目的是方便我们重复使用相同的一段程序.     (1)函数的定义: 函数定义的简单规则: 1.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(): 2.任何传入参数和 ...

  10. 建议10:numpy使用基础

    # -*- coding: utf-8 -*- import numpy as np #---------------------------------------- #-- 定义 ndarray ...