vlambda博客
学习文章列表

NC14 按之字形顺序打印二叉树

情景提要

    牛客题解系列,按照题号顺序开始。







NC14 

按之字形顺序打印二叉树









01




题目描述

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

例如:

NC14 按之字形顺序打印二叉树

该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]



02




输入输出示例

入: 

     {1,2,3,#,#,4,5}

输出: 

     [[1],[3,2],[4,5]]


03




题目分析

NC14 按之字形顺序打印二叉树














      如果是第一次遇到二叉树的层序遍历问题,建议先看下一篇NC15。

      本题的难点在于按之字形遍历。

      case1: 可以使用双端队列,用一个标志位来判断是队头出还是队尾出。

      case2:使用两个栈或者队列。那么到底用哪种,怎么用呢?实践出真知。只要进入的左右顺序和选的数据结构一致就行。我这里选了一种用栈的方法。示例如下:

st1: 1

st2: 2,3  左右

st1: 5,4  右左

通过自己实际推演一遍,具体方法就出来啦。




03




代码实现


方法


/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: // 两个栈来模拟 vector<vector<int> > Print(TreeNode* pRoot) { stack<TreeNode*> st1; stack<TreeNode*> st2; if(pRoot) st1.push(pRoot); TreeNode* node; vector<vector<int>> res; vector<int> tmp; while(!st1.empty() || !st2.empty()){ while(!st1.empty()){ node = st1.top(); st1.pop(); tmp.push_back(node->val); if(node->left) st2.push(node->left); if(node->right) st2.push(node->right); } if(tmp.size()>0) { res.push_back(tmp); tmp.clear(); } while(!st2.empty()){ node = st2.top(); st2.pop(); tmp.push_back(node->val); if(node->right) st1.push(node->right); if(node->left) st1.push(node->left); } if(tmp.size()>0) { res.push_back(tmp); tmp.clear(); } } return res; } };




04




NC14 按之字形顺序打印二叉树

     具体的实际模拟和推演,是解题的良剂。

     两个栈,实现之字形遍历。

NC14 按之字形顺序打印二叉树















NC14 按之字形顺序打印二叉树

NC14 按之字形顺序打印二叉树

欢迎评论区留言讨论哦