层次遍历二叉树

层次遍历二叉树

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:681            测试通过:225

描述

二叉树是非常重要的树形数据结构,层次遍历一棵二叉树是按从上到下、从左到右的次序访问树上的结点。例如,图1020所示的二叉树层次遍历序列为A B C D E F。

图1020

请根据先序遍历序列建立一棵的二叉树(用#代表空树或空子树),输出层次遍历序列。

输入

二叉树的先序遍历序列,用#代表空树或空子树

输出

二叉树层次遍历序列

样例输入

A B # D # # C E # # F # #

样例输出

LevelOrder: A B C D E F

题目来源

CHENZ


分析:class BTNode()、void Create(*&t) 与上题一样,此题按层输出。层序遍历与其他类型的遍历不同的地方在于它不是递归地执行的;它用到队列,而不使用递归所默认的栈。

还有种写法是用到C++提供的list。

#include<iostream>
using namespace std;

//层次遍历二叉树

class BTNode  
{  
public:  
	char data;  
	BTNode *lChild;  
	BTNode *rChild;  

	BTNode(char c)  
	{  
		data = c;  
	}  
};  

void Create(BTNode *&t)  
{  
	char c;  
	cin>>c;  
	if(c == '#')  
		t = NULL;  
	else  
	{  
		t = new BTNode(c);  
		t->lChild = NULL;  
		t->rChild = NULL;  
		Create(t->lChild);  
		Create(t->rChild);  
	}  
}  

//层次遍历
void LevelOrder(BTNode *&t)
{
	int front = 0, rear = 1; // 写在内部
	BTNode *p[100];
	p[0] = t;
	while(front < rear)
	{
		if(p[front])
		{
			cout<<" "<<p[front]->data; 
			p[rear++] = p[front]->lChild;
			p[rear++] = p[front]->rChild;
			front ++;
		}
		else
			front ++;
	}
}

int main()
{
	BTNode *t;
	Create(t);
	cout<<"LevelOrder:";
	LevelOrder(t);
	cout<<endl;

	return 0;
}



用到list的写法:

#include<iostream>
using namespace std;
#include<list>

//层次遍历二叉树

class BTNode  
{  
public:  
	char data;  
	BTNode *lChild;  
	BTNode *rChild;  

	BTNode(char c)  
	{  
		data = c;  
	}  
};  

void Create(BTNode *&t)  
{  
	char c;  
	cin>>c;  
	if(c == '#')  
		t = NULL;  
	else  
	{  
		t = new BTNode(c);  
		t->lChild = NULL;  
		t->rChild = NULL;  
		Create(t->lChild);  
		Create(t->rChild);  
	}  
}  

void LevelOrder(BTNode *&t)
{
	list<BTNode*> myList; // 新建一个list
	if(t == NULL)
		return ;
	else
	{
		myList.push_back(t); // 在list的末尾添加一个元素
		while(myList.size() > 0) // while循环
		{
			BTNode *p = myList.front(); // 返回第一个元素
			cout<<" "<<p->data; 
			if(p->lChild) myList.push_back(p->lChild); // 添加左孩子
			if(p->rChild) myList.push_back(p->rChild); // 添加右孩子
			myList.pop_front(); //  删除第一个元素
		}
	}
}

int main()
{
	BTNode *t;
	Create(t);
	cout<<"LevelOrder:";
	LevelOrder(t);
	cout<<endl;
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值