二叉树叶子结点个数

#include
using namespace std;
//------------------------------------------------------------------------------------------------------------------------
//定义二叉树的结点类型BTNode,其中包含数据域、左孩子,右孩子结点。
template
struct BTNode
{
T data ; //数据域
BTNode* lchild; //指向左子树的指针
BTNode* rchild; //指向右子树的指针
};

template
class BinaryTree
{
BTNode* BT;
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*bt)
{ //销毁一棵二叉树
if(bt)//根结点不空
{
clear(bt->lchild); //递归调用Clear()函数销毁左子树
clear(bt->rchild); //递归调用Clear()函数销毁右子树
delete bt; //释放当前访问的根结点
}
return 0;
}

template
void BinaryTree::CreateBiTree(T end)
{ //创建一棵二叉树:先序序列的顺序输入数据,end为结束的标志
cout<<"请按先序序列的顺序输入二叉树,-1为空指针域标志:"<BTNode*p;
T x;
cin>>x; //输入根结点的数据
if(x==end) return ; //end 表示指针为空,说明树为空
p=new BTNode; //申请内存
if(!p)
{
cout<<"申请内存失败!"<exit(-1);//申请内存失败退出
}
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*p,int k,T end)
{//静态函数,创建二叉树,k为创建左子树还是右子树的标志,end为空指针域的标志
BTNode*q;
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::LevelTraBiTree()
{//利用队列Queue层次遍历二叉树
BTNode *Queue[100]; //利用一维数组作为队列,存放结点的指针
BTNode *b;
int front,rear; //指向队列的头和尾下标
front=rear=0; //队列初始为空
cout<<"层次遍历二叉树的所有结点为: ";

if(BT) //若二叉树不为空。
{
Queue[rear++]=BT; //二叉树的根结点指针进队列。
while(front!=rear) //队列不为空。
{
b=Queue[front++];

//队首的元素出队列
if(b)cout<data<<' '; //输出结点的值
if(b->lchild) Queue[rear++]=b->lchild;//如果左子树不空,进队。
if(b->rchild) Queue[rear++]=b->rchild;//如果右子树不空,进队。
}

}
cout<}
template
int BinaryTree::LeafCount()
{//计算叶子的个数

int count=0;
return Leaf(BT,count);
}
template
static int Leaf(BTNode* p,int &count)
{
//static int count=0;//静态变量,存放叶子结点的个数
if(p)
{
if(p->lchild==NULL&&p->rchild==NULL)
{
cout<data<<' ';
count++;//判断是否为叶子结点
}
Leaf(p->lchild,count);//递归遍历左子树
Leaf(p->rchild,count);//递归遍历右子树
}
return count;

}

void main(void)
{
BinaryTreeTree;
int count=0;
Tree.CreateBiTree(-1);

Tree.LevelTraBiTree();
cout<<"叶子结点为:";
count=Tree.LeafCount();
cout<cout<<"叶子结点个数为:"<
}

相关文档
最新文档