南邮 OJ 1020 层次遍历二叉树

层次遍历二叉树

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

比赛描述

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

1020

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



输入

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

输出

二叉树层次遍历序列

样例输入

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

样例输出

LevelOrder: A B C D E F

题目来源

CHENZ



#include <iostream>
#include <cassert>
#define MAX(a,b) (a>b?a:b)
using namespace std;

template<typename Type>
class QueueNode{
public:
	Type data;
	QueueNode *next;
};

template<typename Type>
class Queue{
public:
	QueueNode<Type> *Head;			//指向第一个元素,方便出队
	QueueNode<Type> *Tail;			//指向最后一个元素,方便插入

	void PushBack(const Type&);
	Type PopFront(void);
};

/*
*函数功能:队尾加入新元素
*入口参数:const Type& data:将要插入的元素
*出口参数:无
*作者:陈汝军
*时间:2014-8-19 20:17:13
*/
template<typename Type>
void Queue<Type>::PushBack(const Type& data){
	if(Head == NULL){
		Head = new QueueNode<Type>();
		Head->data = data;
		Tail = Head;
	}else{
		Tail->next = new QueueNode<Type>();
		Tail->next->data = data;
		Tail = Tail->next;	
	}
}
/*
*函数功能:队首弹出元素
*入口参数:无
*出口参数:Type PopFront:弹出的元素
*作者:陈汝军
*时间:2014-8-19 20:18:08
*/ 
template<typename Type>
Type Queue<Type>::PopFront(void){
	QueueNode<Type> *TempHead = Head;
	Type TempData = Head->data;
	assert(Head!=NULL);
	Head = Head->next;
	delete TempHead;
	return TempData;
}


template<typename Type>
class BTNode{
public:
	Type data;
	BTNode *lChild;
	BTNode *rChild;

	void PreOrder(void);
	void InOrder(void);
	void PostOrder(void);
	static void PreOrderInput(BTNode<Type>* &Head);		//静态成员函数,调用与具体的类无关
	int  Height(void);
	int  NodeNum(void);
	int  LeafNum(void);
	void TransLevel(void);
};

/*
*函数功能:先序遍历二叉树。
*入口参数:this.
*出口参数:无
*作者:陈汝军
*时间:2014-8-18 22:01:59
*/
template<typename Type>
void BTNode<Type>::PreOrder(){
	if(this == NULL)
		return;
	cout<<this->data;
	this->lChild->PreOrder();
	this->rChild->PreOrder();
}
/*
*函数功能:中序遍历二叉树。
*入口参数:this.
*出口参数:无
*作者:陈汝军
*时间:2014-8-18 22:03:36
*/
template<typename Type>
void BTNode<Type>::InOrder(){
	if(this == NULL)
		return;
	this->lChild->InOrder();
	cout<<this->data;
	this->rChild->InOrder();	
}
/*
*函数功能:后序遍历二叉树。
*入口参数:this.
*出口参数:无
*作者:陈汝军
*时间:2014-8-18 22:04:09
*/
template<typename Type>
void BTNode<Type>::PostOrder(){
	if(this == NULL)
		return;
	this->lChild->PostOrder();
	this->rChild->PostOrder();
	cout<<this->data;
}
/*
*函数功能:先序输入二叉树,用#代表空树或空子树。
*入口参数:BTNode* &Head:树的节点指针的引用
*出口参数:无
*作者:陈汝军
*时间:2014-8-18 22:01:59
*/
template<typename Type>
void BTNode<Type>::PreOrderInput(BTNode* &Head){
	Type data;
	cin>>data;
	if(data == '#'){
		Head = NULL;	
	}else{
		Head = new BTNode<Type>();
		Head->data = data;
		BTNode<char>::PreOrderInput(Head->lChild);
		BTNode<char>::PreOrderInput(Head->rChild);	
	}
}
/*
*函数功能:输出二叉树的高度
*入口参数:this:本节点指针
*出口参数:Height:高度
*作者:陈汝军
*时间:2014-8-19 10:21:03
*/
template<typename Type>
int BTNode<Type>::Height(void){
	if(this == NULL){
		return 0;
	}else{
		return MAX(this->lChild->Height(),this->rChild->Height())+1;
	}
}
/*
*函数功能:求二叉树的总结点数
*入口参数:this:本节点指针
*出口参数:NodeNum:以本节点为树根的总节点数
*作者:陈汝军
*时间:2014-8-19 10:24:16
*/
template<typename Type>
int BTNode<Type>::NodeNum(void){
	if(this == NULL){
		return 0;
	}else{
		return this->lChild->NodeNum()+this->rChild->NodeNum()+1;
	}	
}
/*
*函数功能:求二叉树的叶节点数
*入口参数:this:本节点指针
*出口参数:LeafNum:以本节点为树根的叶节点数
*作者:陈汝军
*时间:2014-8-19 10:29:36
*/
template<typename Type>
int BTNode<Type>::LeafNum(void){
	if(this==NULL){
		return 0;
	}else if(this->lChild==NULL && this->rChild==NULL){
		return 1;
	}else{
		return this->lChild->LeafNum()+this->rChild->LeafNum();
	}	
}
/*
*函数功能:层次遍历二叉树
*入口参数:无
*出口参数:无
*作者:陈汝军
*时间:2014-8-19 20:48:29
*/
template<typename Type>
void BTNode<Type>::TransLevel(void){
	Queue<BTNode<Type>*> *que = new Queue<BTNode<Type>*>();
	if(this == NULL)
		return;
	que->PushBack(this);
	while(que->Head!=NULL){					//输出整个队列,输出过程中队列在增长
		if(que->Head->data->lChild!=NULL){
			que->PushBack(que->Head->data->lChild);
		}
		if(que->Head->data->rChild!=NULL){
			que->PushBack(que->Head->data->rChild);
		}
		cout<<" "<<que->PopFront()->data;
	}
}

int main(void){
	BTNode<char> *Head=NULL;
	BTNode<char>::PreOrderInput(Head);
	cout<<"LevelOrder:";
	Head->TransLevel();
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 C++ 实现二叉树层次遍历的示例代码: ```c++ #include <iostream> #include <queue> using namespace std; // 定义二叉树结构体 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 二叉树层次遍历函数 void levelOrder(TreeNode* root) { // 如果根节点为空,则直接返回 if (!root) return; // 创建队列,存储每一层的节点 queue<TreeNode*> q; // 将根节点添加到队列中 q.push(root); // 循环遍历队列中的节点,直到队列为空 while (!q.empty()) { // 获取队列中的节点数量,也就是当前层的节点数量 int size = q.size(); // 循环遍历当前层的所有节点 for (int i = 0; i < size; i++) { // 获取队列中的头节点,并将其弹出 TreeNode* node = q.front(); q.pop(); // 输出当前节点的值 cout << node->val << " "; // 如果当前节点有左子节点,则将其添加到队列中 if (node->left) q.push(node->left); // 如果当前节点有右子节点,则将其添加到队列中 if (node->right) q.push(node->right); } // 输出换行符,表示当前层已经遍历完成 cout << endl; } } int main() { // 创建二叉树 TreeNode *root = new TreeNode(1); root->left = new TreeNode(2); root->right = new TreeNode(3); root->left->left = new TreeNode(4); root->left->right = new TreeNode(5); root->right->left = new TreeNode(6); root->right->right = new TreeNode(7); // 二叉树层次遍历 levelOrder(root); return 0; } ``` 其中,我们使用队列来存储每一层的节点,然后循环遍历队列中的节点,并对于每个节点,输出其值,并将其左右子节点添加到队列中。当当前层的所有节点遍历完成后,我们输出一个换行符,表示当前层已经遍历完成。最后,我们的二叉树层次遍历就完成了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值