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的先序遍历序列为:
1
2
4
5
3
按层输出的结果为:1 2 3 4 5
Program ended with exit code: 0