• 59、剑指offer--按之字形顺序打印二叉树


    题目描述
    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
     
    解题思路:通过分析,使用栈进行存储结点
    打印1时,将结点2 3 放入栈中,打印3时,将3的左右孩子67分别放入栈中想放入7 再放6.
    通过举例分析,对于父结点在偶数行,先放入右子结点、再放入左子结点(栈2),对于父结点在奇数行,先放入左子结点再放入右子结点(栈1)。因此使用两个栈进行存储。
    使用两个栈的原因,例如2 3 都在栈中,弹出3,需要将其子结点入栈,如果只有一个栈入栈,则之后会先弹出3的子结点,再弹出2,因此,一层存入一个栈中。
     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         vector<vector<int> > result;
    15         vector<int> temp;//每一行的间接变量
    16         if(pRoot == NULL)
    17             return result;
    18         stack<TreeNode *> levels[2];//0存奇数行,1存偶数行
    19         int current = 0;
    20         int next = 1;
    21         levels[current].push(pRoot);
    22         while(!levels[0].empty() || !levels[1].empty())
    23         {
    24             TreeNode *pNode = levels[current].top();
    25             levels[current].pop();
    26             temp.push_back(pNode->val);
    27             if(current == 0)//奇数行,先存左子结点,再存右子结点
    28             {
    29                 if(pNode->left != NULL)
    30                     levels[next].push(pNode->left);
    31                 if(pNode->right != NULL)
    32                     levels[next].push(pNode->right);
    33             }
    34             else//偶数行,先存右子结点,再存左子结点
    35             {
    36                 if(pNode->right != NULL)
    37                     levels[next].push(pNode->right);
    38                 if(pNode->left != NULL)
    39                     levels[next].push(pNode->left);
    40             }
    41             if(levels[current].empty())//换行
    42             {
    43                 result.push_back(temp);
    44                 temp.clear();//每行存入完记得清空
    45                 current = 1 - current;
    46                 next = 1- next;
    47             }
    48         }
    49         return result;  
    50     }
    51 };
  • 相关阅读:
    【Java】String和Date、Timestamp之间的转换
    pl/sql改为汉语窗口的办法
    MySql生成随机数
    ETL概念
    oracle数据库中序列使用讲解
    oracle中的merge into用法解析
    mysql实现自动更新时间戳
    3.6:Linux touch命令:修改文件的时间戳
    3.5:Linux rmdir命令:删除空目录
    3.4:Linux mkdir命令:创建目录(文件夹)
  • 原文地址:https://www.cnblogs.com/qqky/p/7115305.html
Copyright © 2020-2023  润新知