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

来源:互联网 发布:mac 鼠标 触摸板 编辑:程序博客网 时间:2024/06/18 17:54

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

分析:采用容器中的适配器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;        }    }}


0 0