建立一棵二叉树,用二叉链表存储二叉树,计算二叉树中包含的结点个数。
输入描述
输入的数据只有一组,是一棵二叉树的先序遍历序列,结点的值为一个小写字母,#号表示空结点,如输入:a b d e # # f # # # c # #,数据之间空一个格,得到的二叉树如下。( 图暂时不能上传,请同学们自己画出图)
输出描述
输出二叉树的结点个数,空树输出NULL。
输入样例
输入样例1:
a b c # # # d e # # f # #
输入样例2:
输出样例
输出样例1:
6
输出样例2:
NULL
#include<iostream>
using namespace std;
struct Node
{
char Data;
Node *lchild,*rchild;//左右子树
} ;
class Text
{
public:
Text()
{
Count = 0; //结点个数初始化为0
root = Creat(); //递归创建树
}
void judge(int Count); //判断结点个数
int Count;
private:
Node *Creat();
void Release(Node *bt); //由于是动态创建的树所以需要释放资源
Node *root; //定义根节点
};
void Text::judge(int Count)
{
if(Count == 0)
{
cout << "NULL" << endl; //如果结点数为0;
}
else
{
cout << Count << endl; //否则输出结点个数
}
}
Node* Text::Creat()
{
Node *bt;
char ch;
cin >> ch;
if(ch == '#')
{
bt = NULL;
}
else
{
Count++;
bt = new Node;
bt->Data = ch;
bt->lchild = Creat(); //递归创建左子树
bt->rchild = Creat(); //递归创建右子树
}
}
void Text::Release(Node *bt) //释放资源
{
if(bt == NULL)
{
return ;
}
else
{
Release(bt->lchild); //递归释放左子树
Release(bt->rchild); //递归释放右子树
delete bt;
}
}
int main()
{
Text t;
t.judge(t.Count);
}