题目:

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

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

    3
/ \
9 20
/ \
15 7

return its bottom-up level order traversal as:

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

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

说明:

        1)与层序遍历1相似,只是本题遍历方向不同:从下往上,其他相同

2) 代码只要加上一行逆序输出的语句即可

实现:

一、 递归实现:

 *
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int>> result;
traverse(root,,result);
std::reverse(result.begin(),result.end());//比层序遍历1多此一行
return result;
}
void traverse(TreeNode *root,size_t level,vector<vector<int>> &result)
{
if(root==nullptr) return;
if(level>result.size()) result.push_back(vector<int>());
result[level-].push_back(root->val);
traverse(root->left,level+,result);
traverse(root->right,level+,result);
}
};

二、迭代实现:

 /**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/*常规层序遍历思想,每层入队结束压入一个空节点,作为标志*/
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int>> vec_vec_tree;//创建空vector,存放最后返回的遍历二叉树的值
vector<int> level;//创建空的vector,存放每一层的遍历二叉树的值
TreeNode *p=root;
if(p==nullptr) return vec_vec_tree;//如果二叉树空,返回空vector<vector<int>>
queue<TreeNode *> queue_tree;//创建一个空队列
queue_tree.push(p);//root节点入队列
queue_tree.push(nullptr);//空节点入队列
while(!queue_tree.empty())//直到队列为空
{
p=queue_tree.front(); //头结点取值,并出队列
queue_tree.pop();
if(p==nullptr&&!level.empty())//节点为空并且队列不为空
{
queue_tree.push(nullptr);//入队空节点,与下一层隔开
vec_vec_tree.push_back(level);//已遍历的层入队
level.clear();//清空vecor level
}
else if(p!=nullptr)//如果节点不空
{
level.push_back(p->val);//遍历
if(p->left) queue_tree.push(p->left);//若有左右孩子,则入队列
if(p->right) queue_tree.push(p->right);//注意入队顺序:先左后右
} }
std::reverse(vec_vec_tree.begin(),vec_vec_tree.end());//比层序遍历1多此一行
return vec_vec_tree;
}
};

b 迭代实现2

 /**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/*两个队列实现*/
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector<vector<int> > result;
if(root == nullptr) return result;
queue<TreeNode*> current, next;//两个队列,保存当层(current)和下层(next)节点
vector<int> level; // 存放每层的节点值
current.push(root);
while (!current.empty())//直到二叉树遍历完成
{
while (!current.empty())//直到本层二叉树遍历完成
{
TreeNode* node = current.front();//取队首节点,出队列
current.pop();
level.push_back(node->val);//访问节点值
if (node->left != nullptr) next.push(node->left);//若存在左右节点,则压入next队列中
if (node->right != nullptr) next.push(node->right);//注意入队顺序为先left后right
}
result.push_back(level);//压入总vector
level.clear();//清vector
swap(next, current);//next队列和current队列交换
}
std::reverse(result.begin(),result.end());//比层序遍历1多此一行
return result;
}
};

leetcode题解:Tree Level Order Traversal II (二叉树的层序遍历 2)的更多相关文章

  1. LeetCode Binary Tree Level Order Traversal II (二叉树颠倒层序)

    题意:从左到右统计将同一层的值放在同一个容器vector中,要求上下颠倒,左右不颠倒. 思路:广搜逐层添加进来,最后再反转. /** * Definition for a binary tree no ...

  2. [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 ...

  3. [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 ...

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

  5. LeetCode OJ: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: 107_Binary Tree Level Order Traversal II | 二叉树自底向上的层次遍历 | Easy

    本题和上题一样同属于层次遍历,不同的是本题从底层往上遍历,如下: 代码如下: struct TreeNode { int val; TreeNode* left; TreeNode* right; T ...

  7. leetcode 107.Binary Tree Level Order Traversal II 二叉树的层次遍历 II

    相似题目: 102 103 107 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode ...

  8. 107 Binary Tree Level Order Traversal II 二叉树的层次遍历 II

    给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7],    3   / \  9 ...

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

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

  10. [leetcode]Binary Tree Level Order Traversal II @ Python

    原题地址:http://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ 题意: Given a binary tree, ...

随机推荐

  1. iis 支持html执行php输出

    iis 支持html执行php输出 2012-07-25 10:50:23|  分类: PHP|举报|字号 订阅     在HTML中有个简单的的PHP随机数需要输出,例如: <td backg ...

  2. printf输出字符串的一些格式

    1. 原样输出字符串:    printf("%s", str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:    printf("%Ns" ...

  3. Python基础-作用域和命名空间(Scope and Namespace)

    在Python中,对象是独立的,不同作用域中的不同名字都可以被绑定在同一个对象上,当然对这个对象的修改会影响所有的引用.赋值操作就是名字和对象的绑定或重绑定.这和C++中的引用是一样的. 1,基础概念 ...

  4. Median of Two Sorted Arrays-----LeetCode

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  5. 引用 1.9.1.min.js dom对象 没有live 绑定事件方法, 引用 1.7.js 就有live 绑定事件方法

    问题:相同环境,引用 1.9.1.min.js $('div[data-role="page"]').live('pagehide', function (event, ui) { ...

  6. 给js function的参数设置默认值

    C# 中 function func(a,b=1){//具体方法} js 中 function func(a,b){ a= arguments[0] || 10; b= arguments[1] || ...

  7. android 解释dp,px,pt,sp单位

    1.dp(dip):不同设备有不同的显示效果,这个和设备硬件有关系,一般我们为了支持WVGA,HVGA和QVGA对剑使用这个,它是不依赖像素的 2.px:pixels(像素),不同设备显示效果相同,一 ...

  8. strlen与sizeof的区别 [转]

    转自:http://www.cppblog.com/liangbo/archive/2006/10/06/13394.html 1.sizeof操作符的结果类型是size_t,它在头文件中typede ...

  9. 【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法

    字符串搜索中,BFS算法很巧妙,个人认为BFS算法效率是最高的. [StringSearch]就是根据BFS算法并优化. 使用方法: string s = "中国|国人|zg人|fuck|a ...

  10. 学习tolua#·20多个例子

    初始项目搭建 clone官方库 新建unity工程 依次把官方库里的Assets和Unity5.x/Assets拷贝到项目Assets里 打开unity工程, 开始逐个学习例子,例子目录: 1. he ...