问题描述:从上到下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如下图中的二叉树 ,则依次打印出8,6,10,5,7,9,11
思路分析:按层打印的顺序决定了应该先打印根节点,所以我们从树的根节点开始分析,为了接下来能够打印值为8的结点的两个子结点,我们应该在遍历到该结点时把值为6和10的两个结点保存到一个容器里,现在容器内就有两个结点了。按照从左到右的打印,我们先取出值为6的结点,打印出值6之后把它的值分别为5和7的两个结点放入数据容器。此时数据容器中有3个结点,值分别为10,5,7。接下来我们从数据容器中取出值为10的结点。注意到值为10的结点比值为5,7的结点先放入容器中,此时又比这两个结点先取出,这就是先入先出。因此,不难看出这个数据容器应该就是一个队列。由于值为5,7,9,11的结点都没有子结点,因此只要依次打印即可。
完整代码:
#include<iostream>
#include<deque>
using namespace std;
typedef struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
//创建一颗二叉树
void CreateBinaryTreeNode(BinaryTreeNode* &pCurrent,int value)
{
if(pCurrent==NULL)
{
BinaryTreeNode* pNode=new BinaryTreeNode();
if(pNode==NULL)
{
throw exception("Allocate Failure");
}
pNode->m_pLeft=NULL;
pNode->m_pRight=NULL;
pNode->m_nValue=value;
pCurrent=pNode;
}
else{
if(pCurrent->m_nValue>value)
{
CreateBinaryTreeNode(pCurrent->m_pLeft,value);
}
else if(pCurrent->m_nValue<value)
{
CreateBinaryTreeNode(pCurrent->m_pRight,value);
}
else{
cout<<"重复加入结点"<<endl;
}
}
}
//核心代码:从上到下打印二叉树
void PrintFromTopToBottom(BinaryTreeNode* pTreeNode)
{
if(pTreeNode==NULL)
{
return;
}
deque<BinaryTreeNode*> dequeTreeNode;
dequeTreeNode.push_back(pTreeNode);//头结点放入队列中
while(dequeTreeNode.size())//循环取出结点
{
BinaryTreeNode* pNode=dequeTreeNode.front();//取出队列中的第一个元素
dequeTreeNode.pop_front();//第一个元素出队列
cout<<pNode->m_nValue<<"\t";
if(pNode->m_pLeft)
{
dequeTreeNode.push_back(pNode->m_pLeft);
}
if(pNode->m_pRight)
{
dequeTreeNode.push_back(pNode->m_pRight);
}
}
}
//前序遍历
void PreOrderTraverseTree(BinaryTreeNode* pRoot)
{
if(pRoot==NULL)
{
return;
}
cout<<pRoot->m_nValue<<"\t";
PreOrderTraverseTree(pRoot->m_pLeft);
PreOrderTraverseTree(pRoot->m_pRight);
}
//中序遍历
void InorderTraverseTree(BinaryTreeNode* pRoot)
{
if(pRoot==NULL)
{
return;
}
InorderTraverseTree(pRoot->m_pLeft);
cout<<pRoot->m_nValue<<"\t";
InorderTraverseTree(pRoot->m_pRight);
}
//后序遍历
void PastorderTraverseTree(BinaryTreeNode* pRoot)
{
if(pRoot==NULL)
{
return;
}
PastorderTraverseTree(pRoot->m_pLeft);
PastorderTraverseTree(pRoot->m_pRight);
cout<<pRoot->m_nValue<<"\t";
}
int main()
{
BinaryTreeNode* pRoot=NULL;
CreateBinaryTreeNode(pRoot,8);
CreateBinaryTreeNode(pRoot,6);
CreateBinaryTreeNode(pRoot,5);
CreateBinaryTreeNode(pRoot,7);
CreateBinaryTreeNode(pRoot,10);
CreateBinaryTreeNode(pRoot,9);
CreateBinaryTreeNode(pRoot,11);
cout<<"前序遍历:"<<endl;
PreOrderTraverseTree(pRoot);
cout<<endl;
cout<<"中序遍历:"<<endl;
InorderTraverseTree(pRoot);
cout<<endl;
cout<<"后序遍历:"<<endl;
PastorderTraverseTree(pRoot);
cout<<endl;
cout<<"从上往下打印二叉树"<<endl;
PrintFromTopToBottom(pRoot);
cout<<endl;
system("pause");
return 0;
}
结果如下图: