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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值