南邮 OJ 1019 计算二叉树的高度和结点数

计算二叉树的高度和结点数

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

比赛描述

二叉树是非常重要的树形数据结构,根据该树的先序、中序或后序遍历序列可以建立一棵二叉树。例如输入先序遍历序列A B # D # # C E # # F # #可以建立图1019-1所示的二叉树,这里用#代表空树或空子树(另一种说法:若无孩子结点,则用#代替),如图1019-2。

1019-1

1019-2

请实现基于遍历的二叉树运算:求高度、计算结点数目



输入

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

输出

共五行

前三行依次输出先序、中序和后序遍历序列,

第四行输出二叉树的高度,

第五行依次输出二叉树总结点数目、叶子结点数目、度为1的结点数目。

样例输入

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

样例输出

PreOrder: A B D C E F
InOrder: B D A E C F
PostOrder: D B E F C A
3

6 3 1


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


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);
};
/*
*函数功能:先序遍历二叉树。
*入口参数: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();
	}	
}
int main(void){
	BTNode<char> *Head=NULL;
	BTNode<char>::PreOrderInput(Head);
	cout<<"PreOrder:";
	Head->PreOrder();
	cout<<endl<<"InOrder:";
	Head->InOrder();
	cout<<endl<<"PostOrder:";
	Head->PostOrder();

	cout<<endl<<Head->Height()<<endl;
	cout<<Head->NodeNum()<<' '<<Head->LeafNum()<<' ';
	if(Head==NULL){
		cout<<0;
	}else{
		cout<<Head->NodeNum()-2*Head->LeafNum()+1;	
	}

	return 0;
}


你可能感兴趣的:(ACM,南邮OJ,计算二叉树的高度和结点数)