題目描述:
請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
解題思路:
從題目分析可知,題目的意思是:從上到下,單數行從左到右打印,雙數行從右到左打印,這就需要我們在求解過程中要記住當前打印的是單數行還是奇數行。
考慮設置兩個輔助棧空間,分別用於存放單數行的數據和雙數行的數據,根據層序遍歷的思想:遍歷某一行時,可以直接將下一行的內容緩存,由此得到處理流程思路:
對上面這個二叉樹:
初始化1入單行棧,1出棧時,需要將1按照左節點進棧、右節點進展的順序,將其子節點壓入雙行棧,這樣後續雙行棧出棧時,出棧順序爲從右到左。
雙行棧出棧時,同樣邊出棧,邊將子節點入單行棧,但是入棧順序是:先入右節點,再入左節點,這樣後續單行棧出棧時,出棧順序爲從左到右。
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> res;
if(pRoot == NULL)
return res;
stack<TreeNode*> s_single;//臨時存放單層的數據
stack<TreeNode*> s_double;//臨時存放雙層的數據
//初始爲1層
int layer = 1;
s_single.push(pRoot);
while(!s_single.empty() || !s_double.empty()){
//雙層
if(layer%2 != 0){
vector<int> v_single;
while(!s_single.empty()){
TreeNode* tmp = s_single.top();
v_single.push_back(tmp->val);
s_single.pop();
if(tmp->left){
s_double.push(tmp->left);
}
if(tmp->right){
s_double.push(tmp->right);
}
}
res.push_back(v_single);
layer++;
}
//單層
else{
vector<int> v_double;
while(!s_double.empty()){
TreeNode* tmp = s_double.top();
v_double.push_back(tmp->val);
s_double.pop();
if(tmp->right){
s_single.push(tmp->right);
}
if(tmp->left){
s_single.push(tmp->left);
}
}
res.push_back(v_double);
layer++;
}
}
return res;
}
};