求二叉树高度,叶子结点及前序遍历

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》第___5___次实验报告

班级:非师3班学号:100814320姓名:邹柱石日期:2011.11.9__成绩:_______ 实验题目:求二叉树中叶子结点的个数及二叉树的高度

一、实验目的

(1) 已知一棵二叉树,求该二叉树中叶子结点的个数及二叉树的高度。

(2) 进一步理解二叉链表存储结构

二、实验内容

(1)采用二叉链表作存储结构;

(2)设计递归算法求叶子结点的个数。

(3)设计非递归算法求叶子结点的个数。

(4)求二叉树的高度。

三、设计与编码

1、基本思想

求二叉树中叶子结点的个数,即求二叉树的所有结点中左、右子树均为空的结点个数之和。因此可以将此问题转化为遍历问题,在遍历中“访问一个结点”时判断该结点是不是叶子,若是则将计数器累加。算法如下:

求二叉树叶子结点个数算法

void CountLeaf(BiNode *root, int &count)

//前序遍历根指针为root的二叉树以计算叶子数count,假定count的初值为0;

{

if (root!=NULL) {

if (root->lchild==NULL && root->rchild = =NULL)

count++; //若root所指的结点是叶子,则计数器加1;

CountLeaf(root->lchild, count); //累计左子树上的叶子数;

CountLeaf(root->rchild, count); //累计右子树上的叶子数;

}

}

非递归算法求叶子结点的个数可参考实验书P215。

求二叉树的高度可以在层序遍历函数中实现。

2、编码

#include

int count=0;

using namespace std;

struct BiNode

{

char data;

BiNode *lchild,*rchild;

};

class BiTree

{

BiNode *root;

BiNode *Creat(BiNode *bt);

void Release(BiNode *bt);

void PreOder(BiNode *bt);

BiTreeDepth(BiNode *bt);

int CountLeaf(BiNode *bt);

public:

BiTree(){root=Creat(root);}

~BiTree(){Release(root);}

void PreOder(){PreOder(root);cout<

BiTreeDepth(){BiTreeDepth(root);}

int CountLeaf(){CountLeaf(root);return count;}

};

BiNode *BiTree::Creat(BiNode *bt)

{

char ch;

cout<<"输入结点";

cin>>ch;

if(ch=='#')bt=NULL;

else{

bt=new BiNode;

bt->data=ch;

bt->lchild=Creat(bt->lchild);

bt->rchild=Creat(bt->rchild);

}

return bt;

}

void BiTree::Release(BiNode *bt)

{

if(bt!=NULL){

Release(bt->lchild);

Release(bt->rchild);

delete bt;

}

}

int BiTree::CountLeaf(BiNode *bt)

{

if (bt!=NULL)

{

if (bt->lchild==NULL && bt->rchild ==NULL) count++;

CountLeaf(bt->lchild);

CountLeaf(bt->rchild);

}

return count;

}

BiTree::BiTreeDepth(BiNode *bt)

{

if(bt==NULL)

return 0;

else

{

int dep1=BiTreeDepth(bt->lchild);

int dep2=BiTreeDepth(bt->rchild);

if(dep1>dep2)

return dep1+1;

else

return dep2+1;

}

}

void BiTree::PreOder(BiNode *bt)

{

if(bt==NULL)return;

else{

cout<data;

PreOder(bt->lchild);

PreOder(bt->rchild);

}

}

int main()

{

BiTree B;

B.BiTreeDepth();

cout<<"前序遍历";

B.PreOder();

cout<<"叶子结点个数:";

cout<

cout<<"高度:";

cout<

return 0;

}四、调试与运行

相关文档
最新文档