题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推
代码:
- /*
- 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) {
- vector<vector<int>> vreturn; // 专门用来返回
- if(pRoot == NULL)
- return vreturn;
- vector<int> vline; // 存储每一行的结点
- vector<vector<int>> v;
- stack<TreeNode*> level[2]; // 定义两个栈,一个存储奇数行,一个存储偶数行
- int current = 0;
- int next = 1;
- level[current].push(pRoot);
- while(!level[0].empty() || !level[1].empty())
- {
- TreeNode* pNode = level[current].top();
- level[current].pop();
- vline.push_back(pNode->val);
- if(current == 0) // 如果当前行是奇数,先把下一行的左结点压入栈,,因为左结点后弹出
- {
- if(pNode->left != NULL)
- {
- level[next].push(pNode->left);
- }
- if(pNode->right != NULL)
- {
- level[next].push(pNode->right);
- }
- }
- else // 如果当前行是偶数,先把下一行中的右结点压入栈,,因为右结点后弹出
- {
- if(pNode->right != NULL)
- {
- level[next].push(pNode->right);
- }
- if(pNode->left != NULL)
- {
- level[next].push(pNode->left);
- }
- }
- if(level[current].empty())
- {
- v.push_back(vline);
- vline.clear(); // 每次都要把 vline 那一行清除,以便存储下一行的数据
- current = 1-current;
- next = 1-next;
- }
- }
- return v;
- }
- };
分析:按照之字形打印二叉树,奇数行按照从左到右的顺序打印,偶数行按照从右往左的顺序打印。这样,定义两个栈即可,分别存储奇数行和偶数行