剑指Offer系列---(25)从上往下打印二叉树

来源:互联网 发布:淘宝淘气值贷款新口子 编辑:程序博客网 时间:2024/04/29 23:09

1.题目描述:
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。
2.分析:
每一次打印一个结点的时候,如果该结点有子结点,则把该结点的子结点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被打印出来为止。
3.源代码:

#include <iostream>#include <stdio.h>#include <deque>using namespace std;typedef struct BinaryTreeNode{    char                     m_nValue;    struct BinaryTreeNode*   m_pLeft;    struct BinaryTreeNode*   m_pRight;}*BinaryTree;void CreateTree(BinaryTree &T){    char data;    cin>>data;    if(data=='*')        T=NULL;    else    {        T = (BinaryTree)malloc(sizeof(BinaryTreeNode));        T->m_nValue = data;        CreateTree(T->m_pLeft);        CreateTree(T->m_pRight);    }}void Print(BinaryTree T){    if(T)    {        cout<<T->m_nValue<<endl;        Print(T->m_pLeft);        Print(T->m_pRight);    }}void PrintFromTopToDown(BinaryTreeNode *pRoot){    if(!pRoot)        return;    deque<BinaryTreeNode*>myDeque;    myDeque.push_back(pRoot);    while(!myDeque.empty())    {        BinaryTreeNode *pTop = myDeque.front();        cout<<pTop->m_nValue<<" ";        myDeque.pop_front();        if(pTop->m_pLeft != NULL)        {            myDeque.push_back(pTop->m_pLeft);        }        if(pTop->m_pRight != NULL)        {            myDeque.push_back(pTop->m_pRight);        }    }}int main(int argc,char *argv[]){    BinaryTree T1;    cout<<"以先序遍历的顺序创建的二叉树T1:"<<endl;    CreateTree(T1);    cout<<"原始的二叉树T1的先序遍历序列为:"<<endl;    Print(T1);    cout<<"按层输出的结果为:";    PrintFromTopToDown(T1);    cout<<endl;    return 0;}

4.运行效果:

以先序遍历的顺序创建的二叉树T1:124**5**3**原始的二叉树T1的先序遍历序列为:12453按层输出的结果为:1 2 3 4 5 Program ended with exit code: 0

0 0