二叉树的之字形层序遍历(NC14/考察次数Top21/难度中等)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的之字形层序遍历(NC14/考察次数Top21/难度中等)相关的知识,希望对你有一定的参考价值。
描述:
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树如下
该二叉树之字形层序遍历的结果是
[
[3],
[20,9],
[15,7]
]
示例1
输入:
{1,#,2}
返回值:
[[1],[2]]
(题目来自牛客网)
用C++实现如下
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
//思路,和二叉树的层序遍历一样,添加一个bool变量来控制从左到右或者从右到左的方向
//解题思路,定义两个vector变量分别用来存当前层和下一层的节点,再根据bool变量判断是否反转即可
if(root == NULL)
return {};
vector<TreeNode*> v1 = {root};
bool reverse = false; //标志位,用于处理之字形
vector<vector<int>> res; //存放结果
while(!v1.empty())
{
vector<int> tmp; //存放一层层的val结果,每次进行初始化操作,保证存储是当前层的val值
vector<TreeNode*> next; //存放每一层的节点结果,每次进行初始化操作,保证存储的是当前层的下一层
for(auto& it : v1) //每次遍历完一层的结果,把val值push到tmp中
{
tmp.push_back(it->val);
if(it->left != NULL)
next.push_back(it->left);
if(it->right != NULL)
next.push_back(it->right);
}
if(reverse) //如果遇到需要反向的,则先将存放val值的tmp的vector先reverse之后再push到res中去
{
std::reverse(tmp.begin(),tmp.end());
res.push_back(tmp);
}else{
res.push_back(tmp);
}
reverse = !reverse; //每次相反
v1 = next; //保持当前排下一排的结果
}
return res;
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于二叉树的之字形层序遍历(NC14/考察次数Top21/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章