整理自劍指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;
}
};