• 剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]


    1 题目描述

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

    2 思路和方法

    先给定一个二叉树的样式:

      输出的样式是:[[1], [3,2], [4,5,6,7]]。包含以下信息: (1)每一层所包含的树节点;(2)偶数层的树节点需倒序。

      思路: 面对要求的偶数层倒序,亦有两种解题思路,第一种是:获取到所有节点的值后,将偶数层的节点值倒序(先存right,再存left实现倒序)。第二种则是在获取节点的值的时候就倒序存入。定义两堆栈stack1和stack2,在遍历当前层节点的同时!stack1.empty() TreeNode *data=stack1.top();,存储下一层的节点(stack2.push(data->right),stack2.push(data->left)),以此类推,!stack2.empty() TreeNode *data=stack2.top();,存储下一层的节点(stack1.push(data->left),stack2.push(data->right))。     

    3 C++核心代码

     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         if(pRoot==nullptr)
    16             return result;
    17         stack<TreeNode*> stack1,stack2;//分别存奇数和偶数层
    18         stack1.push(pRoot);
    19         while(!stack1.empty() || !stack2.empty()){
    20             if(!stack1.empty()){
    21                 vector<int> temp;
    22                 while(!stack1.empty()){
    23                     TreeNode *data=stack1.top();
    24                     stack1.pop();
    25                     temp.push_back(data->val);
    26                     if(data->left!=nullptr)
    27                         stack2.push(data->left);
    28                     if(data->right!=nullptr)
    29                         stack2.push(data->right);
    30                 }
    31                 result.push_back(temp);
    32             }
    33             if(!stack2.empty()){
    34                 vector<int> temp;
    35                 while(!stack2.empty()){
    36                     TreeNode *data=stack2.top();
    37                     stack2.pop();
    38                     temp.push_back(data->val);
    39                     if(data->right!=nullptr)
    40                         stack1.push(data->right);
    41                     if(data->left!=nullptr)
    42                         stack1.push(data->left);
    43                 }
    44                 result.push_back(temp);
    45             }
    46         }
    47         return result;
    48     }
    49 };
    View Code

    参考资料

    https://blog.csdn.net/u010005281/article/details/79759926

     
  • 相关阅读:
    分治6--循环比赛日程表
    分治5--一元三次方程求解
    分治4--快速排序
    分治3--黑白棋子的移动
    分治2--取余运算
    分治1--二分查找
    贪心6--整数区间
    贪心5--活动选择
    贪心4--拦截导弹
    贪心3--删数问题
  • 原文地址:https://www.cnblogs.com/wxwhnu/p/11434545.html
Copyright © 2020-2023  润新知