题目:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印,例如图,则依次打印出8,6,10,5,7,9,11.
分析:在学习数据结构的时候,我们学习了二叉树的三种遍历方式:前序,中序,后续遍历,可是没有一种是可以像题目中所要求的打印方式,这就要用到辅助工具了,我们知道队列是一个先进先出的的结构,我们用队列就可以很容易的解决这个题目,下面直接对代码进行解析:
#include<iostream>
#include <queue>
using namespace std;
struct BinaryTreeNode //二叉树结构
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
typedef struct BinaryTreeNode NODE;
typedef struct BinaryTreeNode* PNODE;
PNODE create(PNODE tree, PNODE r, int value) //创建二叉树
{
if (!r)//申请节点空间
{
r = (PNODE)malloc(sizeof(NODE));//r=new BinaryTreeNode;
if (!r)//已无内存,申请失败
{
printf("内存分配失败!");
exit(0);
}
//初始化节点
r->m_pLeft = NULL;
r->m_pRight = NULL;
r->m_nValue = value;
if (!tree)//二叉树头节点为空直接返回r节点;
return r;
if (value<tree->m_nValue) //当值小于头节点值放在左节点,否则放右节点
tree->m_pLeft = r;
else
tree->m_pRight = r;
return r;
}
if (value < r->m_nValue)//递归创建后面的二叉树结点
create(r, r->m_pLeft, value);
else
create(r, r->m_pRight, value);
return tree;
}
void PrintFromTopToBottom(BinaryTreeNode* pTreeNode)//打印个节点的值
{
if (!pTreeNode)//判断二叉树是否为空,为空直接返回,增强程序鲁棒性。
return;
queue<BinaryTreeNode*> dequeTreeNode;//定义队列
dequeTreeNode.push(pTreeNode);//头节点放入队列中
while (dequeTreeNode.size()){//循环取出节点放入队列中
BinaryTreeNode *pNode = dequeTreeNode.front();//取出队列中的第一个元素
dequeTreeNode.pop();//取出值之后就出队列删掉
cout << pNode->m_nValue;//打印取出来的值
if (pNode->m_pLeft)dequeTreeNode.push(pNode->m_pLeft);//左节点放入队列
if (pNode->m_pRight)dequeTreeNode.push(pNode->m_pRight);//右节点放入队列
}
}
int main()
{
int array[7];
PNODE tree = NULL;
cout << "Please input array's element:";
for (int i = 0; i < 7; i++)
{
cin >> array[i];
tree = create(tree, tree, array[i]);
}
PrintFromTopToBottom(tree);
system("pause");
return 0;
}
本题是对于二叉树与队列的理解的考察,多数据结构相结合使用是面试中很喜欢出的题目,慢慢积累,如果对于二叉树的基础不够理解,还是熟悉二叉树的知识后再来理解就很容易了