求二叉树高度,叶子结点及前序遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》第___5___次实验报告
班级:非师3班学号:100814320姓名:邹柱石日期:2011.11.9__成绩:_______ 实验题目:求二叉树中叶子结点的个数及二叉树的高度
一、实验目的
(1) 已知一棵二叉树,求该二叉树中叶子结点的个数及二叉树的高度。
(2) 进一步理解二叉链表存储结构
二、实验内容
(1)采用二叉链表作存储结构;
(2)设计递归算法求叶子结点的个数。
(3)设计非递归算法求叶子结点的个数。
(4)求二叉树的高度。
三、设计与编码
1、基本思想
求二叉树中叶子结点的个数,即求二叉树的所有结点中左、右子树均为空的结点个数之和。因此可以将此问题转化为遍历问题,在遍历中“访问一个结点”时判断该结点是不是叶子,若是则将计数器累加。算法如下:
求二叉树叶子结点个数算法
void CountLeaf(BiNode
//前序遍历根指针为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< PreOder(bt->lchild); PreOder(bt->rchild); } } int main() { BiTree B; B.BiTreeDepth(); cout<<"前序遍历"; B.PreOder(); cout<<"叶子结点个数:"; cout< cout<<"高度:"; cout< return 0; }四、调试与运行