- 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
- 使用两个栈,记为st_1(存储正向打印的数据), st_2(存储逆向打印的数据),打印方向必然与存储顺序相反
- 当打印方向为正向时,即从st_1出栈时,st_2应当按序存储每个点的孩子节点,切先存储左孩子,再存右孩子。
- 当打印方向为逆向时,即从st_2出栈时,st_1应当按序存储每个点的孩子节点,切先存储右孩子,再存左孩子。
- 一次正向打印和一次逆向打印为一次循环
- C++ 代码
/*
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;
vector<int> tmp;
if(!pRoot) return res;
stack<TreeNode *> q;
stack<TreeNode *> s;
q.push(pRoot);
while(!q.empty()||!s.empty()){
while(!q.empty()){
tmp.push_back(q.top()->val);
TreeNode * left = q.top()->left;
TreeNode * right = q.top()->right;
if(left)
s.push(left);
if(right)
s.push(right);
q.pop();
}
res.push_back(tmp);
tmp.clear();
while(!s.empty()){
tmp.push_back(s.top()->val);
TreeNode * left = s.top()->left;
TreeNode * right = s.top()->right;
if(right)
q.push(right);
if(left)
q.push(left);
s.pop();
}
if(!tmp.empty())
res.push_back(tmp);
tmp.clear();
}
return res;
}
};
网友评论