《劍指offer》:[61]按之字形順序列印二叉樹

塵虛緣_KY發表於2016-06-30
題目:請實現一個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三層再按照從左到右列印,其他行以此類推。

例如:按之字形順序列印二叉樹的結果如下圖:


列印結果:

1

3,2

4,5,6,7

15,14,13,12,11,10,9,8

方案:利用兩個棧。時間複雜度O(N)+輔助空間2*O(N)。

具體方法:我們在列印某一結點時,把下一層的子結點儲存到相應的棧裡。如果當前列印的是奇數層(例如第一層,第三層...第2*n+1層),則先儲存左子結點再儲存右子結點到棧裡;如果當前列印的是偶數層(2*n),則先儲存右子結點再儲存左子結點。具體分析步驟如下:


具體實現程式碼:
#include <iostream>
#include <stack>
using namespace  std;
struct BinaryTree
{
	int data;
	BinaryTree *pLeft;
	BinaryTree *pRight;
};
BinaryTree *pRoot=NULL;
void CreateTree(BinaryTree *&root)
{
	int data;
	cin>>data;
	if(0==data)
		root=NULL;
	else
	{
		root =new BinaryTree;
		root->data=data;
		CreateTree(root->pLeft);
		CreateTree(root->pRight);
	}
}
void PrintZhi(BinaryTree *root)
{
	if(NULL==root)
		return;
	stack<BinaryTree*> level[2];
	int current=0;
	int next=1;
	level[current].push(root);
	while(!level[0].empty() || !level[1].empty())
	{
		BinaryTree *node=level[current].top();
		level[current].pop();
		cout<<node->data<<" ";
		if(current==0)
		{
			if(node->pLeft!=NULL)//從左端開始入棧;
				level[next].push(node->pLeft);
			if(node->pRight!=NULL)
				level[next].push(node->pRight);
		}
		else
		{
			if(node->pRight!=NULL)
				level[next].push(node->pRight);
			if(node->pLeft!=NULL)
				level[next].push(node->pLeft);
		}
		if(level[current].empty())
		{
			cout<<endl;
			current=1-current;
			next=1-next;
		}
	}
}
void PreOrder(BinaryTree *root)
{
	if(root)
	{
		cout<<root->data<<" ";
		PreOrder(root->pLeft);
		PreOrder(root->pRight);
	}
}
int main()
{
	CreateTree(pRoot);
	cout<<"前序遍歷:";
	PreOrder(pRoot);
	cout<<endl;
	cout<<"之字形列印結果如下:"<<endl;
	PrintZhi(pRoot);
	system("pause");
	return 0;
}

執行結果:


相關文章