【剑指offer】之字形打印二叉树,C++实现

原创文章,转载请注明出处!

本题牛客网地址

博客文章索引地址

博客文章中代码的github地址

1.题目

      请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

例如:

输入二叉树


剑指Offer(五十九):按之字顺序打印二叉树

输出顺序

1

3 2

4 5 6 7

15 14 13 12 12 10 9 8


2.思路

      本题使用两个栈作为辅助容器。打印某一层节点时,把下一层的子节点保存到栈内。如果当前打印的是奇数层,则先保存左子树节点再保存右子树节点到第一个栈内;如果当前打印的是偶数层,则先保存右子树在保存左子树节点到第二个栈内。

http://cuijiahua.com/wp-content/uploads/2018/01/basis_59_2.png

3.代码

  1 /*
  2 struct TreeNode {
  3     int val;
  4     struct TreeNode *left;
  5     struct TreeNode *right;
  6     TreeNode(int x) :
  7             val(x), left(NULL), right(NULL) {
  8     }
  9 };
 10 */
 11 class Solution {
 12 public:
 13     vector<vector<int> > Print(TreeNode* pRoot) {
 14 
 15         // 存储结果
 16         vector<vector<int> > results;
 17         vector<int> rlt_temp;
 18 
 19         // 边界条件
 20         if(pRoot == nullptr)
 21             return results;
 22 
 23         // 辅助容器
 24         stack<TreeNode*> stk[2]; // stk[0]是奇数层,stk[1]是偶数层
 25         int now = 0;
 26         int next = 1;
 27         TreeNode* temp=pRoot;
 28 
 29         // 根节点入栈
 30         stk[now].push(temp);
 31 
 32         // 遍历两个栈,当两个栈均为空时,跳出循环
 33         while(!stk[now].empty() || !stk[next].empty()){
 34             // 存储遍历结果
 35             temp = stk[now].top();
 36             rlt_temp.push_back(temp->val);
 37             stk[now].pop();
 38 
 39             // 当前层是奇数或偶数
 40             if(now==0)
 41             {
 42                 // 当前层是奇数时,左子树先入栈,右子树后入栈
 43                 if(temp->left!=nullptr)
 44                     stk[next].push(temp->left);
 45                 if(temp->right!=nullptr)
 46                     stk[next].push(temp->right);
 47             }
 48             else
 49             {
 50                 // 当前层是偶数时,右子树先入栈,左子树后入栈
 51                 if(temp->right!=nullptr)
 52                     stk[next].push(temp->right);
 53                 if(temp->left!=nullptr)
 54                     stk[next].push(temp->left);
 55             }
 56 
 57             // 当前层为空时,打印下一层
 58             if(stk[now].empty())
 59             {
 60                 results.push_back(rlt_temp);
 61                 rlt_temp.clear();
 62                 now=1-now;
 63                 next = 1-next;
 64             }
 65         }
 66         return results;
 67     }
 68 };

posted @ 2018-03-24 15:24  wanglei5205  阅读(2088)  评论(0编辑  收藏  举报
levels of contents