之字形打印二叉树,例子如下所示:
采用两个栈来实现之字形打印,两个栈分别存储奇数和偶数行二叉树的节点
/*
* 1
* / \
* 2 3
* / \ /
* 4 5 6
*
*/
#include <iostream>
#include <vector>
#include <string>
#include <stack>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x): val(x),left(NULL),right(NULL) { }
};
vector<vector<int>> print(TreeNode* root)
{
vector<vector<int>> ret;
if(root == NULL)
return ret;
stack<TreeNode*> odd,even;
odd.push(root);
while(odd.size()!= 0 || even.size() != 0)
{
TreeNode* temp;
vector<int> vtemp;
while(odd.size() != 0)
{
temp = odd.top();
odd.pop();
vtemp.push_back(temp->val);
if(temp->left)
even.push(temp->left);
if(temp->right)
even.push(temp->right);
}
if(vtemp.size()!=0)
ret.push_back(vtemp);
vector<int>().swap(vtemp);
while(even.size()!=0)
{
temp = even.top();
even.pop();
vtemp.push_back(temp->val);
if(temp->right)
odd.push(temp->right);
if(temp->left)
odd.push(temp->left);
}
if(vtemp.size()!=0)
{
ret.push_back(vtemp);
}
}
return ret;
}
int main()
{
TreeNode* p1 = new TreeNode(1);
TreeNode* p2 = new TreeNode(2);
TreeNode* p3 = new TreeNode(3);
TreeNode* p4 = new TreeNode(4);
TreeNode* p5 = new TreeNode(5);
TreeNode* p6 = new TreeNode(6);
p1->left = p2;
p1->right = p3;
p2->left = p4;
p2->right = p5;
p3->left = p6;
TreeNode* root = p1;
vector<vector<int>> ret;
ret = print(root);
for(int i = 0;i<ret.size();i++)
{
for(int j = 0;j<ret[i].size();j++)
{
cout << ret[i][j] << " ";
}
cout << endl;
}
}
上例中的输出为
1
3 2
4 5 6