剑指Offer——之字形打印二叉树

题目描述:实现一个函数按照之子形顺序打印二叉树。即第一行按照从左向右的顺序打印,第二层按照从右向左的顺序打印,第三行按照从左向右的顺序打印,其他以此类推。

分析:采用容器中的适配器stack,两个stack分别存储奇数行结点和偶数行结点。

如果当前打印的是奇数行(第一、三层等),则先保存左子结点,再保存右子结点。

如果当前打印的是偶数行(第二、四层等),则先保存右子结点,再保存左子节点。

void printree(BinaryTreeNode *pRoot)
{
    if(pRoot==NULL)
        return;
    stack<BinaryTreeNode*> levels[2];
    int cur=0;
    int next=1;

    levels[cur].push(pRoot);
    while(!levels[0].empty() || !levels[1].empty())
    {
        BinaryTreeNode *pNode=pRoot;
        pNode=levels[cur].top();
        levels[cur].pop();

        printf("%d ",pNode->m_nValue);

        if(cur==0)//当前打印行为奇数数
        {
            if(pNode->m_nLeft!=NULL)
                levels[next].push(pNode->m_nLeft);
            if(pNode->m_nRight!=NULL)
                levels[next].push(pNode->m_nRight);
        }
        else//当前打印行为偶数
        {
            if(pNode->m_nRight!=NULL)
                levels[next].push(pNode->m_nRight);
            if(pNode->m_nLeft!=NULL)
                levels[next].push(pNode->m_nLeft);

        }

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值