【剑指offer】之字形打印二叉树,C++实现
原创文章,转载请注明出处!
1.题目
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
例如:
输入二叉树
输出顺序
1
3 2
4 5 6 7
15 14 13 12 12 10 9 8
本题使用两个栈作为辅助容器。打印某一层节点时,把下一层的子节点保存到栈内。如果当前打印的是奇数层,则先保存左子树节点再保存右子树节点到第一个栈内;如果当前打印的是偶数层,则先保存右子树在保存左子树节点到第二个栈内。
3.代码
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 15 // 存储结果 16 vector<vector<int> > results; 17 vector<int> rlt_temp; 18 19 // 边界条件 20 if(pRoot == nullptr) 21 return results; 22 23 // 辅助容器 24 stack<TreeNode*> stk[2]; // stk[0]是奇数层,stk[1]是偶数层 25 int now = 0; 26 int next = 1; 27 TreeNode* temp=pRoot; 28 29 // 根节点入栈 30 stk[now].push(temp); 31 32 // 遍历两个栈,当两个栈均为空时,跳出循环 33 while(!stk[now].empty() || !stk[next].empty()){ 34 // 存储遍历结果 35 temp = stk[now].top(); 36 rlt_temp.push_back(temp->val); 37 stk[now].pop(); 38 39 // 当前层是奇数或偶数 40 if(now==0) 41 { 42 // 当前层是奇数时,左子树先入栈,右子树后入栈 43 if(temp->left!=nullptr) 44 stk[next].push(temp->left); 45 if(temp->right!=nullptr) 46 stk[next].push(temp->right); 47 } 48 else 49 { 50 // 当前层是偶数时,右子树先入栈,左子树后入栈 51 if(temp->right!=nullptr) 52 stk[next].push(temp->right); 53 if(temp->left!=nullptr) 54 stk[next].push(temp->left); 55 } 56 57 // 当前层为空时,打印下一层 58 if(stk[now].empty()) 59 { 60 results.push_back(rlt_temp); 61 rlt_temp.clear(); 62 now=1-now; 63 next = 1-next; 64 } 65 } 66 return results; 67 } 68 };