算法进阶——按之字形顺序打印二叉树

题目


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

数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=1500

要求:空间复杂度:O(n),时间复杂度:O(n)

例如:
给定的二叉树是{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]]

思路


用两个辅助栈,通过层序遍历二叉树,需要注意的是因为奇数层要从左往右打印,所以前一个偶数层入栈需要先右后左,偶数层正好相反。

总结规律就是奇数层先左后右入栈,偶数层先右后左入栈。

解答代码


/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <stack>
#include <vector>
class Solution {
   
public:
    /**
     * @param pRoot TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > Print(TreeNode* pRoot) {
   
        // write code here
        vector<vector<int> > res{
   };
        if (pRoot == nullptr) {
   
            return res;
        }

        stack<TreeNode*> odd_level;// 奇数层,从左往右打印
        stack<TreeNode*> even_level;// 偶数层,从右往左打印
        int cur = 1;// 当前层索引
        odd_level.push(pRoot);

        vector<int> tmp;
        while (!odd_level.empty() || !even_level.empty()) {
   
            if ((cur&1) == 1) {
   
                // 奇数层
                auto size = odd_level.size();
                for (int i = 0; i < size; i++) {
   
                    auto node = odd_level.top();
                    tmp.push_back(node->val);

                    // 先左后右
                    if (node->left != nullptr) {
   
                        even_level.push(node->left);
                    }
                    if (node->right != nullptr) {
   
                        even_level.push(node->right);
                    }

                    odd_level.pop();
                }
            } else {
   
                // 偶数层
                auto size = even_level.size();
                for (int i = 0; i < size; i++) {
   
                    auto node = even_level.top();
                    tmp.push_back(node->val);

                    // 先右后左
                    if (node->right != nullptr) {
   
                        odd_level.push(node->right);
                    }
                    if (node->left != nullptr) {
   
                        odd_level.push(node->left);
                    }

                    even_level.pop();
                }
            }
            ++cur;
            res.push_back(tmp);
            tmp.clear();
        }

        return res;
    }
};

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 22:10:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 22:10:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 22:10:03       87 阅读
  4. Python语言-面向对象

    2024-01-13 22:10:03       96 阅读

热门阅读

  1. Go语言的调度器

    2024-01-13 22:10:03       68 阅读
  2. 代码随想录 739. 每日温度

    2024-01-13 22:10:03       61 阅读
  3. What is `WebMvcConfigurer` does?

    2024-01-13 22:10:03       67 阅读
  4. Python学习之路-函数进阶

    2024-01-13 22:10:03       65 阅读
  5. springboot 注解+AOP实现接口方法出入参打印

    2024-01-13 22:10:03       68 阅读
  6. 力扣labuladong——一刷day91

    2024-01-13 22:10:03       66 阅读
  7. apply、call、bind的区别 如何实现一个bind

    2024-01-13 22:10:03       69 阅读
  8. PC-lint Plus在安全系统中的应用

    2024-01-13 22:10:03       45 阅读
  9. C语言版数据结构与算法pta合集:7-3 括号匹配

    2024-01-13 22:10:03       60 阅读
  10. 【已解决】C语言如何使用宽字符输出中文

    2024-01-13 22:10:03       64 阅读
  11. mysql修复VIEWRESIDENTHIST 数据

    2024-01-13 22:10:03       59 阅读