二叉树叶子结点个数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
using namespace std;
//------------------------------------------------------------------------------------------------------------------------
//定义二叉树的结点类型BTNode,其中包含数据域、左孩子,右孩子结点。
template
struct BTNode
{
T data ; //数据域
BTNode* lchild; //指向左子树的指针
BTNode* rchild; //指向右子树的指针
};
template
class BinaryTree
{
BTNode
public:
BinaryTree(){BT=NULL;} // 构造函数,将根结点置空
~BinaryTree(){clear(BT);} // 调用Clear()函数将二叉树销毁
void ClearBiTree(){clear(BT);BT=NULL;}; // 销毁一棵二叉树
void CreateBiTree(T end); // 创建一棵二叉树,end为空指针域标志
int LeafCount(); // 计算叶子结点的个数
void LevelTraBiTree(); // 利用队列层次遍历二叉树
};
template
static int clear(BTNode
{ //销毁一棵二叉树
if(bt)//根结点不空
{
clear(bt->lchild); //递归调用Clear()函数销毁左子树
clear(bt->rchild); //递归调用Clear()函数销毁右子树
delete bt; //释放当前访问的根结点
}
return 0;
}
template
void BinaryTree
{ //创建一棵二叉树:先序序列的顺序输入数据,end为结束的标志
cout<<"请按先序序列的顺序输入二叉树,-1为空指针域标志:"<
T x;
cin>>x; //输入根结点的数据
if(x==end) return ; //end 表示指针为空,说明树为空
p=new BTNode
if(!p)
{
cout<<"申请内存失败!"<
}
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
BT=p; //根结点
create(p,1,end);//创建根结点左子树,1为标志,表示左子树
create(p,2,end);//创建根结点右子树,2为标志,表示右子树
}
template
static int create(BTNode
{//静态函数,创建二叉树,k为创建左子树还是右子树的标志,end为空指针域的标志
BTNode
T x;
cin>>x;
if(x!=end)
{ //先序顺序输入数据
q=new BTNode
q->data=x;
q->lchild=NULL;
q->rchild=NULL;
if(k==1) p->lchild=q; //q为左子树
if(k==2) p->rchild=q; //p为右子树
create(q,1,end); //递归创建左子树
create(q,2,end); //递归创建右子树
}
return 0;
}
template
void BinaryTree
{//利用队列Queue层次遍历二叉树
BTNode
BTNode
int front,rear; //指向队列的头和尾下标
front=rear=0; //队列初始为空
cout<<"层次遍历二叉树的所有结点为: ";
if(BT) //若二叉树不为空。
{
Queue[rear++]=BT; //二叉树的根结点指针进队列。
while(front!=rear) //队列不为空。
{
b=Queue[front++];
//队首的元素出队列
if(b)cout<
if(b->lchild) Queue[rear++]=b->lchild;//如果左子树不空,进队。
if(b->rchild) Queue[rear++]=b->rchild;//如果右子树不空,进队。
}
}
cout<
template
int BinaryTree
{//计算叶子的个数
int count=0;
return Leaf(BT,count);
}
template
static int Leaf(BTNode
{
//static int count=0;//静态变量,存放叶子结点的个数
if(p)
{
if(p->lchild==NULL&&p->rchild==NULL)
{
cout<
count++;//判断是否为叶子结点
}
Leaf(p->lchild,count);//递归遍历左子树
Leaf(p->rchild,count);//递归遍历右子树
}
return count;
}
void main(void)
{
BinaryTree
int count=0;
Tree.CreateBiTree(-1);
Tree.LevelTraBiTree();
cout<<"叶子结点为:";
count=Tree.LeafCount();
cout<
}