题目:

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

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

return its bottom-up level order traversal as:

  1. [
  2. [15,7],
  3. [9,20],
  4. [3]
  5. ]

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

说明:

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

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

实现:

一、 递归实现:

  1. *
  2. * Definition for binary tree
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. class Solution {
  11. public:
  12. vector<vector<int> > levelOrder(TreeNode *root) {
  13. vector<vector<int>> result;
  14. traverse(root,,result);
  15. std::reverse(result.begin(),result.end());//比层序遍历1多此一行
  16. return result;
  17. }
  18. void traverse(TreeNode *root,size_t level,vector<vector<int>> &result)
  19. {
  20. if(root==nullptr) return;
  21. if(level>result.size()) result.push_back(vector<int>());
  22. result[level-].push_back(root->val);
  23. traverse(root->left,level+,result);
  24. traverse(root->right,level+,result);
  25. }
  26. };

二、迭代实现:

  1. /**
  2. * Definition for binary tree
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. /*常规层序遍历思想,每层入队结束压入一个空节点,作为标志*/
  11. class Solution {
  12. public:
  13. vector<vector<int> > levelOrder(TreeNode *root) {
  14. vector<vector<int>> vec_vec_tree;//创建空vector,存放最后返回的遍历二叉树的值
  15. vector<int> level;//创建空的vector,存放每一层的遍历二叉树的值
  16. TreeNode *p=root;
  17. if(p==nullptr) return vec_vec_tree;//如果二叉树空,返回空vector<vector<int>>
  18. queue<TreeNode *> queue_tree;//创建一个空队列
  19. queue_tree.push(p);//root节点入队列
  20. queue_tree.push(nullptr);//空节点入队列
  21. while(!queue_tree.empty())//直到队列为空
  22. {
  23. p=queue_tree.front(); //头结点取值,并出队列
  24. queue_tree.pop();
  25. if(p==nullptr&&!level.empty())//节点为空并且队列不为空
  26. {
  27. queue_tree.push(nullptr);//入队空节点,与下一层隔开
  28. vec_vec_tree.push_back(level);//已遍历的层入队
  29. level.clear();//清空vecor level
  30. }
  31. else if(p!=nullptr)//如果节点不空
  32. {
  33. level.push_back(p->val);//遍历
  34. if(p->left) queue_tree.push(p->left);//若有左右孩子,则入队列
  35. if(p->right) queue_tree.push(p->right);//注意入队顺序:先左后右
  36. }
  37.  
  38. }
  39. std::reverse(vec_vec_tree.begin(),vec_vec_tree.end());//比层序遍历1多此一行
  40. return vec_vec_tree;
  41. }
  42. };

b 迭代实现2

  1. /**
  2. * Definition for binary tree
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  8. * };
  9. */
  10. /*两个队列实现*/
  11. class Solution {
  12. public:
  13. vector<vector<int> > levelOrder(TreeNode *root) {
  14. vector<vector<int> > result;
  15. if(root == nullptr) return result;
  16. queue<TreeNode*> current, next;//两个队列,保存当层(current)和下层(next)节点
  17. vector<int> level; // 存放每层的节点值
  18. current.push(root);
  19. while (!current.empty())//直到二叉树遍历完成
  20. {
  21. while (!current.empty())//直到本层二叉树遍历完成
  22. {
  23. TreeNode* node = current.front();//取队首节点,出队列
  24. current.pop();
  25. level.push_back(node->val);//访问节点值
  26. if (node->left != nullptr) next.push(node->left);//若存在左右节点,则压入next队列中
  27. if (node->right != nullptr) next.push(node->right);//注意入队顺序为先left后right
  28. }
  29. result.push_back(level);//压入总vector
  30. level.clear();//清vector
  31. swap(next, current);//next队列和current队列交换
  32. }
  33. std::reverse(result.begin(),result.end());//比层序遍历1多此一行
  34. return result;
  35. }
  36. };

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. java实现图片与base64字符串之间的转换

    package cn.com; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOEx ...

  2. APP接口版本兼容的问题

    现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改.新的APP和接口开发后,接口如何兼容老的 ...

  3. GetWindowThreadProcessId用法(转)

    函数功能:该函数返回创建指定窗口线程的标识和创建窗口的进程的标识符,后一项是可选的. 函数原型:DWORD GetWindowThreadProcessld(HWND hwnd,LPDWORD lpd ...

  4. C:数组

    数组.排序 关于排序 :参考 关于数组: 参考 求a[i][j]行与列的和然后求平均值 参考 二维数组使用指针的表示方法  参考 字符串数组:char  name [5][20] ={ {} , {} ...

  5. Gson 和 Fastjson 你不知道的事

    背景 目前在公司负责的业务, 主要是跟JSON数据打交道, fastjson .gson都用, 他们适用于不同场景.fastjson号称是业界处理json效率最高的框架, 没有之一.但在某些场景下, ...

  6. Web网站压力测试工具

    使用Microsoft Web Application Stress Tool对web进行压力测试 不错关于压力测试博客: http://blog.sina.com.cn/s/blog_5155e8d ...

  7. EWARM STM32 向量表偏移设置

    system_stm32f2xx.c #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table ...

  8. 书写CSS需要注意的地方

    1.注意对图片设置宽高和转化为块2.文字超出的设置3.空白部分用空div来设置4.做之前考虑重用,重用部分命名不要和内容相关 尽量公共(comWidth area small big img list ...

  9. Flexigrid在IE下不显示数据的处理

    文章总结自我的论坛提问: http://bbs.csdn.net/topics/390498434?page=1#post-394918028 解决方法: 网上的答案经我验证都是不靠谱的,以后大家就知 ...

  10. [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 在<仙剑奇侠传>.<古剑奇谭>等游戏中,常常须要玩家在一个3D场景中 ...