题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
上图按之字形打印的结果为:
1
3 2
4 5 6 7
15 14 13 12 11 10 9 8
思路:对于奇数层和偶数层,它们的打印顺序是不一样的。打印第一层的时候将第二层数据保存,打印第二层的时候保存第三层的数据,上一层打印完才打印下一层,因此这里我们需要额外两个辅助空间保存数据。这里用栈实现,因为第二层先打印右边的,所以按照栈后先进后出的原则,所以打印第一层的时候,第二层应该先保存左子树,再保存右子树。第三层的时候从左往右打印,所以第三层保存的时候先保存右子树,再保存左子树,以此类推。
void Print(BinaryTreeNode* pRoot)
{
if(pRoot == NULL)
return;
int next = 1;
int current = 0;
stack<BinaryTreeNode*> level[2];
level[current].push(pRoot);
while(!level[current].empty() || !level[next].empty())
{
BinaryTreeNode* pNode = level[current].top();
cout << pNode->m_nValue << " " ;
level[current].pop();
if(current == 0)
{
if(pNode->m_pLeft != NULL)
level[next].push(pNode->m_pLeft);
if(pNode->m_pRight != NULL)
level[next].push(pNode->m_pRight);
}
else
{
if(pNode->m_pRight != NULL)
level[next].push(pNode->m_pRight);
if(pNode->m_pLeft != NULL)
level[next].push(pNode->m_pLeft);
}
if(level[current].empty())
{
cout << endl;
current = next;
next = 1 - next;
}
}
}