计算二叉树的高度和结点数
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:738 测试通过:220
void BinaryTree<T>::Create(BTNode<T>*& t){
char c;
cin>>c;
if(c=='#')
t=NULL;
else{
t=new BTNode<T>(c);
Create(t->lChild);
Create(t->rChild);
}
}
总提交:738 测试通过:220
描述
二叉树是非常重要的树形数据结构,根据该树的先序、中序或后序遍历序列可以建立一棵二叉树。例如输入先序遍历序列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
提示
//根据先序遍历序列创建一个二叉树!
template<class T>void BinaryTree<T>::Create(BTNode<T>*& t){
char c;
cin>>c;
if(c=='#')
t=NULL;
else{
t=new BTNode<T>(c);
Create(t->lChild);
Create(t->rChild);
}
}
题目来源
CHENZ
#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 PreOrder(BTNode *&t)
{
if(t != NULL)
{
cout<<" "<<t->data;
PreOrder(t->lChild);
PreOrder(t->rChild);
}
}
//中序遍历
void InOrder(BTNode *&t)
{
if(t != NULL)
{
InOrder(t->lChild);
cout<<" "<<t->data;
InOrder(t->rChild);
}
}
//后序遍历
void PostOrder(BTNode *&t)
{
if(t != NULL)
{
PostOrder(t->lChild);
PostOrder(t->rChild);
cout<<" "<<t->data;
}
}
//高度
int Height(BTNode *&t)
{
int lHeight, rHeight;
if(t == NULL)
return 0;
else
{
lHeight = Height(t->lChild) + 1;
rHeight = Height(t->rChild) + 1;
}
return (lHeight > rHeight ? lHeight : rHeight);
}
//所有节点个数
int All(BTNode *&t, int &sum1)
{
if(t)
{
sum1 ++;
All(t->lChild, sum1);
All(t->rChild, sum1);
}
return sum1;
}
//叶子节点个数
int Leaf(BTNode *&t, int &sum2)
{
if(t)
{
if(t->lChild == NULL && t->rChild == NULL) // 叶子节点
sum2 ++;
Leaf(t->lChild, sum2);
Leaf(t->rChild, sum2);
}
return sum2;
}
//度为1的节点个数
int Du(BTNode *&t, int &sum3)
{
if(t)
{
if( ( t->lChild == NULL && t->rChild != NULL ) || ( t->lChild != NULL && t->rChild == NULL ) )
sum3 ++;
Du(t->lChild, sum3);
Du(t->rChild, sum3);
}
return sum3;
}
int main()
{
int sum1 = 0, sum2 = 0, sum3 = 0;
BTNode *t;
Create(t);
cout<<"PreOrder:";
PreOrder(t);
cout<<endl;
cout<<"InOrder:";
InOrder(t);
cout<<endl;
cout<<"PostOrder:";
PostOrder(t);
cout<<endl;
cout<<Height(t)<<endl;
cout<<All(t, sum1)<<" "<<Leaf(t, sum2)<<" "<<Du(t, sum3)<<endl;
return 0;
}