您的位置:首页 > 职场人生

面试题61:按之字形顺序打印二叉树

2015-05-04 11:58 239 查看
题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:

8 --------0

6 10 --------1

5 7 9 11 --------0

打印结果为:

8

10 6

5 7 9 11

思路:设置两个栈,栈0和栈1
1.当行数标识为0的时候,将当前行的结点先将左子树入栈0,再将右子树入栈0,如8,先将6入栈,再将10入栈,栈0现在从顶往下是10 6,
2.然后判断栈0是否为空,不为空开始从顶打印,首先是10,因为10所在的行标识为1,所以将10的右子树先入栈1,再将左子树入栈1,栈1当前为9 11,然后10出栈
3.打印6,将6的右子树先压入栈1之后是左子树,6出栈,栈1当前为5 7 9 11
4.判断栈0是否为空,此时为空,然后将0设为1,开始对栈1进行判断,栈1保存结点的下一行设为0.

剑指offer代码:

void Print(BTNode * root)
{
if(root==NULL)
return;

stack<BTNode *> levels[2];//创建两个栈
int current=0;//当前行标识,初始化为0
int next=1;//下一行标识,初始化为1
levels[current].push(root);
//如果两个栈有一个不为空
while(!levels[0].empty()||!levels[1].empty())
{
BTNode * node=levels[current].top();//获取当前栈的栈顶结点
levels[current].pop();//栈顶结点出栈
if(current==0)
{
//先将左结点入栈,再将右结点入栈
if(node->left!=NULL)
levels[next].push(node->left);
if(node->right!=NULL)
levels[next].push(node->right);
}
else
{
//先将右结点入栈,再将左结点入栈
if(node->right!=NULL)
levels[next].push(node->right);
if(node->left!=NULL)
levels[next].push(node->left);
}

if(levels[current].empty())
{
printf("\n");
current=1-current;
next=1-next;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: