leetcode 题解:Binary Tree Level Order Traversal (二叉树的层序遍历)
题目:
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.
说明:
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);
- 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);
- }
- };
- 二、迭代实现
a 迭代实现1
- /**
- * 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);//注意入队顺序:先左后右
- }
- }
- 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队列交换
- }
- return result;
- }
- };
最后说明:如果 从下到上,从右到左如何遍历,如何实现
我的想法:从下到上,直接把结果vector<vector<int>>逆序即可
从右到左,把入队顺序改为先右后左即可
leetcode 题解:Binary Tree Level Order Traversal (二叉树的层序遍历)的更多相关文章
- 【LeetCode】102. Binary Tree Level Order Traversal 二叉树的层序遍历 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS DFS 日期 题目地址:https://lee ...
- 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, ...
- leetcode 102.Binary Tree Level Order Traversal 二叉树的层次遍历
基础为用队列实现二叉树的层序遍历,本题变体是分别存储某一层的元素,那么只要知道,每一层的元素都是上一层的子元素,那么只要在while循环里面加个for循环,将当前队列的值(即本层元素)全部访问后再执行 ...
- 【LeetCode】Binary Tree Level Order Traversal(二叉树的层次遍历)
这道题是LeetCode里的第102道题. 题目要求: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15 ...
- [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, ...
- [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 ...
- 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 ...
- 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 ...
- Leetcode 102 Binary Tree Level Order Traversal 二叉树+BFS
二叉树的层次遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ...
随机推荐
- 文件拷贝以及base64
File inFile = new File("d:" + File.separator + "test.jpg"); File outFile = new F ...
- Map排序——按key排序,按value排序
注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5959279.html 上一篇博文谈到了集合类的自定义排序方式,那么进一步扩展开来,与集合同等重要的Map有 ...
- ASP.NET中使用 Response.Write("<script>alert('****');</script>");后CSS界面发生变化的解决方法 (经验证)
在后台使用Response.Write("<script>alert('Hello World');</script>);弹出alert窗口后发现网页的界面和原来CS ...
- jquery 应用小结
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 11.聚合(Aggregation)
聚合关系是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系,此时整体与部分之间是可分离的,它们可以具有各自的生命周期.比如计算机与CPU.公司与员工的关系等.表现在代码层面,和关联关 ...
- Form动态下拉框
FORM级触发器:WHEN-NEW-FORM-INSTANCE 1.定义: V_LIST_NAME11 VARCHAR2(100) := 'QUERY_FIND.UPDATE_TYPE' ...
- 凯尔卡C68全球版汽车电脑诊断仪
产品简介: C68汽车故障诊断仪是凯尔卡公司新推出的一款集经济.简约.稳定.耐用于一体的汽车诊断设备, 该产品采用了最新的智能移植技术,集成度高:C68车型覆盖广,测试功能强大.数据准确等优点, 是目 ...
- 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 ...
- Codefoces 429 D. Tricky Function
裸的近期点对.... D. Tricky Function time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- ARM&Linux 下驱动开发第一节(小试牛刀)
#include<linux/init.h> #include<linux/module.h> static int __init hello_init(void) { pri ...