剑指32-3 从上到下打印二叉树

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

 

例如:
给定二叉树: [3,9,20,null,null,15,7],

3
/ \
9 20
/ \
15 7
返回其层次遍历结果:

[
[3],
[20,9],
[15,7]
]

 

本题要分行打印,所以需要提前记录每行的长度。因为要之字形,所以需要2个栈,分别处理偶数行和奇数行。如果当前是奇数行(root视为第一行),就先压入左子树再压入右子树;否则就先压入右子树再压入左子树。

这里用even来标记是奇数行还是偶数行,配合stack数组可以简化代码。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<vector<int>> levelOrder(TreeNode* root) {
13         if(root==nullptr)
14             return {};
15         vector<vector<int>> ret;
16         vector<int> partial_ret;
17         stack<TreeNode*> stackTreenodes[2];
18         int even=1;
19         TreeNode* curptr=root;
20         stackTreenodes[1-even].push(curptr);
21         while(!stackTreenodes[1-even].empty()){
22             even=1-even;
23             int size=stackTreenodes[even].size();
24             while(size!=0){
25                 curptr=stackTreenodes[even].top();
26                 stackTreenodes[even].pop();
27                 size--;
28                 partial_ret.push_back(curptr->val);
29                 if(even){
30                     if(curptr->right!=nullptr)
31                         stackTreenodes[1-even].push(curptr->right);
32                     if(curptr->left!=nullptr)
33                         stackTreenodes[1-even].push(curptr->left);
34                 }
35                 else{
36                     if(curptr->left!=nullptr)
37                         stackTreenodes[1-even].push(curptr->left); 
38                     if(curptr->right!=nullptr)
39                         stackTreenodes[1-even].push(curptr->right);
40                 }
41             }
42             ret.push_back(partial_ret);
43             partial_ret.clear();
44         }
45         return ret;
46     }
47 };

 

posted @ 2020-07-04 12:33  __rookie  阅读(91)  评论(0编辑  收藏  举报