1. 程式人生 > >《劍指offer》之從上往下列印二叉樹

《劍指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;
}
本題是對於二叉樹與佇列的理解的考察,多資料結構相結合使用是面試中很喜歡出的題目,慢慢積累,如果對於二叉樹的基礎不夠理解,還是熟悉二叉樹的知識後再來理解就很容易了