​BM27 按之字形顺序打印二叉树​

知识点​栈​​​​树​​​​队列​

描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

数据范围:[二叉树]BM27 按之字形顺序打印二叉树-中等_二叉树,树上每个节点的val满足 [二叉树]BM27 按之字形顺序打印二叉树-中等_之字形_02

要求:空间复杂度:[二叉树]BM27 按之字形顺序打印二叉树-中等_数组插入_03,时间复杂度:[二叉树]BM27 按之字形顺序打印二叉树-中等_数组插入_03例如:

给定的二叉树是{1,2,3,#,#,4,5}

[二叉树]BM27 按之字形顺序打印二叉树-中等_数组插入_05

该二叉树之字形层序遍历的结果是[[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. 借助于栈

这里提供第一种方式的实现,代码如下:

#include <bits/stdc++.h>

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