整理自剑指Offer
一:题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
二:解题思路
以上面的例子为例:
第一层:1 从左往右打印
第二层:2,3 从右往左打印
第三层:4,5,6,7,从左往右打印
第四层:8,9,10,11,12,13,14,15 从右往左打印
我们可以看出 第二层相当于 第一层左右子树入栈后的出栈顺序
第三层相当于 第二层出栈顺序(3,2),右左子树入栈后的出栈顺序
所以整个流程可以利用栈来实现,不过奇偶层数的不同入栈的书序也不同,所以我们使用两个栈。
偶数栈:先左后右入栈
奇数栈:先右后左入栈
三:代码实现
/*
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> > result;
vector<int> temp;
if(pRoot==NULL)
return result;
stack<TreeNode* > oddStack;
stack<TreeNode* > evenStack;
oddStack.push(pRoot);
while(!oddStack.empty() || !evenStack.empty()){
int topNum;
TreeNode* pNode;
//打印奇数行,从左向右(从1开始)
while(!oddStack.empty()){
pNode=oddStack.top();
topNum=pNode->val;
oddStack.pop();
temp.push_back(topNum);
//下一层从右往左打印,左子树先入栈,右子树再入栈(栈后进先出)
if(pNode->left!=NULL)
evenStack.push(pNode->left);
if(pNode->right!=NULL)
evenStack.push(pNode->right);
}
//注意了!!!
if(temp.size()!=0)
result.push_back(temp);
temp.clear();
//打印偶数行,从右向左
while(!evenStack.empty()){
pNode=evenStack.top();
topNum=pNode->val;
evenStack.pop();
temp.push_back(topNum);
//下一层从左往右打印。右子树先入栈,左子树再入栈
if(pNode->right!=NULL)
oddStack.push(pNode->right);
if(pNode->left!=NULL)
oddStack.push(pNode->left);
}
//注意了!!!
if(temp.size()!=0)
result.push_back(temp);
temp.clear();
}
return result;
}
};