题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路
开始是参照二叉树层次遍历,在其中加了个栈进行之字遍历输出,后来发现有问题,将队列也改成栈之后就正确了.
设出两个栈:
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;
}
};