题目:

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

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

return its level order traversal as:

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

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

说明:

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. return result;
  16. }
  17. void traverse(TreeNode *root,size_t level,vector<vector<int>> &result)
  18. {
  19. if(root==nullptr) return;
  20. if(level>result.size()) result.push_back(vector<int>());
  21. result[level-].push_back(root->val);
  22. traverse(root->left,level+,result);
  23. traverse(root->right,level+,result);
  24. }
  25. };
  26.  
  27. 二、迭代实现
    a 迭代实现1
  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. return vec_vec_tree;
  40. }
  41. };

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. return result;
  34. }
  35. };

最后说明:如果 从下到上,从右到左如何遍历,如何实现

我的想法:从下到上,直接把结果vector<vector<int>>逆序即可

从右到左,把入队顺序改为先右后左即可

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

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

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

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

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

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

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

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

  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] 314. Binary Tree Vertical Order Traversal 二叉树的垂直遍历

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

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

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

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

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

随机推荐

  1. 文件拷贝以及base64

    File inFile = new File("d:" + File.separator + "test.jpg"); File outFile = new F ...

  2. Map排序——按key排序,按value排序

    注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5959279.html 上一篇博文谈到了集合类的自定义排序方式,那么进一步扩展开来,与集合同等重要的Map有 ...

  3. ASP.NET中使用 Response.Write("<script>alert('****');</script>");后CSS界面发生变化的解决方法 (经验证)

    在后台使用Response.Write("<script>alert('Hello World');</script>);弹出alert窗口后发现网页的界面和原来CS ...

  4. jquery 应用小结

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 11.聚合(Aggregation)

    聚合关系是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系,此时整体与部分之间是可分离的,它们可以具有各自的生命周期.比如计算机与CPU.公司与员工的关系等.表现在代码层面,和关联关 ...

  6. Form动态下拉框

    FORM级触发器:WHEN-NEW-FORM-INSTANCE   1.定义:      V_LIST_NAME11 VARCHAR2(100) := 'QUERY_FIND.UPDATE_TYPE' ...

  7. 凯尔卡C68全球版汽车电脑诊断仪

    产品简介: C68汽车故障诊断仪是凯尔卡公司新推出的一款集经济.简约.稳定.耐用于一体的汽车诊断设备, 该产品采用了最新的智能移植技术,集成度高:C68车型覆盖广,测试功能强大.数据准确等优点, 是目 ...

  8. uva140 - Bandwidth

    Bandwidth Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an orderi ...

  9. Codefoces 429 D. Tricky Function

    裸的近期点对.... D. Tricky Function time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  10. ARM&Linux 下驱动开发第一节(小试牛刀)

    #include<linux/init.h> #include<linux/module.h> static int __init hello_init(void) { pri ...