剑指offer 按之字型顺序打印二叉树
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
使用两个栈进行存储,我们在打印某一行节点的时候,需要将下一行的节点保存到相应的栈中,如果当前打印奇数层,那么先保存左子节点,再保存右子节点;
如果我们当前打印的偶数层,那么先保存右子节点,再保存左子节点。
注意循环退出条件。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { stack<TreeNode*> odd;//先左后右 stack<TreeNode*> even;//先右后左 vector<vector<int> > result; if(pRoot == nullptr){ return result; } TreeNode* p = pRoot; int flag = 1; odd.push(p); while(!odd.empty() || !even.empty()){ vector<int> tmp; if(flag % 2){//当前奇数层 while(!odd.empty()){ p = odd.top(); tmp.push_back(p -> val); odd.pop(); if(p -> left != nullptr){ even.push(p -> left); } if(p -> right != nullptr){ even.push(p -> right); } } result.push_back(tmp); ++flag; } else{//当前偶数层 while(!even.empty()){ p = even.top(); tmp.push_back(p -> val); even.pop(); if(p -> right != nullptr){ odd.push(p -> right); } if(p -> left != nullptr){ odd.push(p -> left); } } result.push_back(tmp); ++flag; } } return result; } };