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