南邮 OJ 1020 层次遍历二叉树

来源:互联网 发布:java虚拟机 编辑:程序博客网 时间:2024/06/08 01:16

层次遍历二叉树

时间限制(普通/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 0
原创粉丝点击