剑指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

 
posted @ 2019-08-30 13:36  wxwreal  阅读(322)  评论(0编辑  收藏  举报