完全二叉树算法
学院名称
专业班级
实验成绩
学生姓名
学号
实验日期
课程名称
数据结构
实验题目
2  树
一、实验目的与要求
熟悉树的各种表示方法和各种遍历方式,掌握有关算法的实现,了解树在计算机科学及其它工程技术中的应用。
二、主要仪器设备
Cfree
、实验内容和原理
[问题描述]
编写递归算法,计算二叉树中叶子结点的数目。
[输入]
一棵二叉树的结点若无子树,则可将其子树看作“.,输入时,按照前序序列的顺序输入该结点的内容。对例题中的树,其输入序列ABD..EH...CF.I..G..
                                                     
                                                           
                                                         
                                                           
[输出]
若为空二叉树,则输出:THIS IS A EMPTY BINARY TREE。若二叉树不空,输出叶子结点的个数。
[存储结构]
采用二叉链表存储
[算法的基本思想]
采用递归方法建立和遍历二叉树。首先建立二叉树的根结点,然后建立其左右子树,直到空子树为止。遍历二叉树,若某一结点的左右孩子均为NULL,则该结点为叶子结点。
[参考源程序]
#include <stdio.h>
#include<malloc.h>
struct node{
char info;
struct node *llink, *rlink;
};
typedef struct node NODE;
NODE *create(){              //构造二叉树
char x;
NODE *p;
scanf("%c", &x);
printf("%c", x);              //打印出已输入的二叉树
if(x!='.'){
p=(NODE *)malloc(sizeof(NODE));
p->info=x;
p->llink=create();
p->rlink=create();
}
else  p=NULL;
return p;
}
int run(NODE *t){
static int count=0;
if(t){                   
run(t->llink);                //递归遍历左子树,直到叶子处
run(t->rlink);                //递归遍历右子树,直到叶子处
if(t->llink ==NULL && t->rlink == NULL) {
count++;
}
}
return count;
}
main()
{ NODE *T;
int left_number;
printf("请输入一棵树:\n" );
T=create();
printf("\n");
if(!T)  printf("This is a empty binary tree.");
else{
left_number=run(T);
printf("\n这棵树共有 %d 个子叶. \n", left_number);
}
printf("\n");}
四、实验结果与分析
(2)习题1:注意叶子结点是指该结点既没有左孩子又没有右孩子,采用递归算法就很容易计算出其数目。
实验结果如图:
五、实验心得及体会
本次实验加深了我对树的各种遍历方法。尤其是先序遍历。在建立树的过程中更是采取了递归的方法。有的算法用递归表示要比用循环表示简洁精练[如二叉树的遍历],代码更简洁清晰,可读性更好有的算法递归能实现循环不一定能实现递归的内部实现要消耗额外的空间和时间。所以说循环的效率更高。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。