題目描述
請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
思路
開始是參照二叉樹層次遍歷,在其中加了個棧進行之字遍歷輸出,後來發現有問題,將隊列也改成棧之後就正確了.
設出兩個棧:
stack<TreeNode*>mys1;//左右存
stack<TreeNode*>mys2;//右左存
mys1 存儲奇數層,每次從左孩子到右孩子壓棧,
mys2存儲偶數層,每次從右孩子到左孩子壓棧。
當mys1.pop 的時候是給mys2進行壓棧,當mys1爲空的時候對mys2進行pop,對mys1進行壓棧,這樣交替入棧出棧,便可完成按之字形順序打印二叉樹。
代碼
/*
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>>res;
stack<TreeNode*>mys1;//左右存
stack<TreeNode*>mys2;//右左存
TreeNode* ptr = nullptr;
if (pRoot == nullptr)
return res;
mys1.push(pRoot);
while (!mys1.empty() || !mys2.empty()) {
vector<int>tmp;
while (!mys1.empty()) {
ptr = mys1.top();
mys1.pop();
tmp.push_back(ptr->val);
if (ptr->left != nullptr)
mys2.push(ptr->left);
if (ptr->right != nullptr)
mys2.push(ptr->right);
}
if (!tmp.empty()){
res.push_back(tmp);
tmp.clear();
}
while (!mys2.empty()) {
ptr = mys2.top();
mys2.pop();
tmp.push_back(ptr->val);
if (ptr->right != nullptr)
mys1.push(ptr->right);
if (ptr->left != nullptr)
mys1.push(ptr->left);
}
if (!tmp.empty()) {
res.push_back(tmp);
tmp.clear();
}
}
return res;
}
};