描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:,树上每个节点的val满足
要求:空间复杂度:,时间复杂度:例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]
示例1
输入:
{1,2,3,#,#,4,5}
复制返回值:
[[1],[3,2],[4,5]]
复制说明:
如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。
示例2
输入:
{8,6,10,5,7,9,11}
复制返回值:
[[8],[10,6],[5,7,9,11]]
复制
示例3
输入:
{1,2,3,4,5}
复制返回值:
[[1],[3,2],[4,5]]
题解
借鉴层次遍历的实现,只需要在偶数层的时候从左到右排序,奇数层的时候从右到左排序即可,可以有以下几种思路:
- 1. 使用vector的push_back和insert(begin,value)
- 2. 使用dequeue双端队列
- 3. 借助于栈
这里提供第一种方式的实现,代码如下:
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj
std::vector<std::vector<int>> Print(TreeNode *pRoot)
{
std::vector<std::vector<int>> ans;
if (pRoot == nullptr)
{
return ans;
}
int level = 0;
std::queue<TreeNode *> q;
q.push(pRoot);
while (!q.empty())
{
int n = q.size();
std::vector<int> v;
while (n-- > 0)
{
auto node = q.front();
q.pop();
if (node->left != nullptr)
{
q.push(node->left);
}
if (node->right != nullptr)
{
q.push(node->right);
}
if (level % 2 == 0)
{
v.push_back(node->val);
}
else
{
v.insert(v.begin(), node->val);
}
}
ans.push_back(v);
level++;
}
return ans;
}