将一棵二叉树按“之”字型打印是什么意思呢?如下图所示的二叉树,遍历之后打印结果如右图,即为二叉树的之字型打印。
分析题意:当打印奇数行时,按照从左到右的顺序打印,当打印偶数行时,要按照从右往左相反的方向打印,这样的结构很自然想到用栈来实现,但我们需要创建两个栈,来区分偶数行和奇数行的情况。当为奇数行时,需要从右到左入栈,从左到右出栈,偶数行相反。
代码实现:
//之字形遍历
void Print()
{
_Print(_root);
}
void _Print(Node* root)
{
if (root == NULL)
return;
stack<Node*> s[2];//两个栈
int cur = 0;
int next = 1;
s[cur].push(root);
while (!s[0].empty() || !s[1].empty())
{
Node* pNode = s[cur].top();
s[cur].pop();
cout << pNode->_data << " ";
if (cur == 0)//当前是偶数层,下一层是奇数层
{
if (pNode->_left != NULL)
s[next].push(pNode->_left);
if (pNode->_right != NULL)
s[next].push(pNode->_right);
}
else//下一层是偶数层
{
if (pNode->_right)
s[next].push(pNode->_right);
if (pNode->_left)
s[next].push(pNode->_left);
}
if (s[cur].empty())//交换
{
cout << endl;
cur = 1 - cur;
next = 1 - next;
}
}
}