二叉树的之字层序遍历

二叉树的之字形层序遍历

http://www.nowcoder.com/questionTerminal/47e1687126fa461e8a3aff8632aa5559

利用栈的特性,采用两个栈来实现:

  • 栈1,存放偶数层节点
  • 栈2,存放奇数层节点

栈1出栈的时候,将下一层节点push到栈2,这样就实现了不断反转的效果。

有一个至关重要的细节:对栈2出栈并将下一层节点推入栈1的过程中,需要先入右节点再入左节点,否则无法保证顺序。这个特性可以借助例子推导一下。

//
// Created by jt on 2020/8/22.
//
#include <vector>
#include <stack>
using namespace std;


class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
        // write code here
        vector<vector<int> > res;
        if (!root) return res;
        stack<TreeNode *> stk1, stk2; // stk1存储偶数层,stk2存储奇数层
        stk1.push(root);
        while (!stk1.empty() || !stk2.empty()) {
            vector<int> vec;
            while (!stk1.empty()) {
                TreeNode *node = stk1.top();
                stk1.pop();
                vec.push_back(node->val);
                if (node->left) stk2.push(node->left);
                if (node->right) stk2.push(node->right);
            }
            if (vec.size() > 0) res.push_back(vec);
            vec.clear();
            while (!stk2.empty()) {
                TreeNode *node = stk2.top();
                stk2.pop();
                vec.push_back(node->val);
                // 偶数层:先入右再入左
                if (node->right) stk1.push(node->right);
                if (node->left) stk1.push(node->left);
            }
            if (vec.size() > 0) res.push_back(vec);
        }
        return res;
    }
};
刷遍天下无敌手 文章被收录于专栏

秋招刷题历程

全部评论
又看到大佬了
点赞 回复 分享
发布于 2021-03-17 23:01
大佬的解法还是那么优雅
点赞 回复 分享
发布于 2021-01-08 15:28

相关推荐

Lorn的意义:1.你这根本就不会写简历呀,了解太少了 2.你这些项目经历感觉真的没啥亮点啊,描述的不行,重写书写一下让人看到核心,就继续海投 注意七八月份ofer还是比较多的,越往后机会越少,抓住时机,抓紧检查疏漏,加油查看图片
点赞 评论 收藏
分享
07-07 12:47
门头沟学院 Java
码农索隆:竟然还真有卡体检报告的
点赞 评论 收藏
分享
评论
20
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务