《剑指offer》之从上往下打印二叉树

来源:互联网 发布:mac隐藏的照片 编辑:程序博客网 时间:2024/05/17 04:11

题目:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印,例如图,则依次打印出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;elsetree->m_pRight = r;return r;}if (value < r->m_nValue)//递归创建后面的二叉树结点create(r, r->m_pLeft, value);elsecreate(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;}
本题是对于二叉树与队列的理解的考察,多数据结构相结合使用是面试中很喜欢出的题目,慢慢积累,如果对于二叉树的基础不够理解,还是熟悉二叉树的知识后再来理解就很容易了

0 0
原创粉丝点击