zoukankan      html  css  js  c++  java
  • 【剑指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 };

  • 相关阅读:
    C/C++取出变量的每一位的值(第一次知道还有QBitArray)
    什么样的程序员适合去创业公司
    VC2008如何生成及使用DLL(图文并茂,完整版)
    Qt浅谈之二十六图片滑动效果
    Qt 学习之路 2(75):线程总结
    Big Data Ingestion and streaming product introduction
    Qt学习之路(24): QPainter(改写paintEvent)
    Qt学习之路(54): 自定义拖放数据对象
    Qt学习之路(49): 通用算法
    Qt核心剖析: moc
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/8639178.html
Copyright © 2011-2022 走看看