题目:按之字形顺序打印二叉树
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路
①层次遍历,然后偶数行reverse。听闻面试的时候会被鄙视,因为海量数据的时候效率低
②用两个vector代替,但vector复制需要消耗时间
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
if(pRoot == NULL) return res; //空的返回空
vector<TreeNode *> v1,v2;
v1.push_back(pRoot);
bool flag=true;//ture从左往右,false从右往左
while(!v1.empty()){
v2 = v1;
v1.clear();
vector<int> row;
while(!v2.empty()){
TreeNode *now = v2.back(); //最后一个
v2.pop_back();
row.push_back(now->val);
if(flag){
if(now->left!=NULL) v1.push_back(now->left);
if(now->right!=NULL) v1.push_back(now->right);
}
else{
if(now->right!=NULL) v1.push_back(now->right);
if(now->left!=NULL) v1.push_back(now->left);
}
}
flag = !flag;
res.push_back(row);
row.clear();
}
return res;
}
}
③用一个栈的数组替换v1,v2. 这样在入栈、出栈之间,自然就满足了交换操作。
class Solution{
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
if(pRoot == NULL) return res; //空的返回空
stack<TreeNode *> s1,s2;
s1.push(pRoot);
vector<int> row;
while(!s1.empty() || !s2.empty()){
while(!s1.empty()){
TreeNode *now = s1.top();
row.push_back(now->val);
s1.pop();
if(now->left) s2.push(now->left);
if(now->right) s2.push(now->right);
}
res.push_back(row);
row.clear();
while(!s2.empty()){
TreeNode *now = s2.top();
row.push_back(now->val);
s2.pop();
if(now->right) s1.push(now->right);
if(now->left) s1.push(now->left);
}
if(row.size()!=0)
res.push_back(row);
row.clear();
}
return res;
}
}