实验八 求二叉树的高度、叶子数
1、实验目的:
(1)理解二叉树的二叉链表存储。
(2)理解二叉树这种递归数据结构以及其操作的递归实现。
2、实验环境与设备:
已安装Visual Studio 2010(或其以上版本)集成开发环境的计算机。
3、实验原理:
(1)二叉树的二叉链表存储。
(2)二叉树的三种遍历算法。
4、实验内容:
(1)基于标明空子树的先序遍历序列构造一棵采用二叉链表存储的二叉树。(空子树用“#”表示,如某棵二叉树的标明空子树的先序遍历序列为:ABC##DE#G##F###)
(2)设计递归算法求这棵二叉树的高度和叶子总数。
5、实验考核:
(1)完成纸质版实验报告
(2)提交电子版作业
6、执行结果示例如下:
上述二叉树如下图所示。
#include <stdio.h>
#include "stdlib.h"
#define STACK_INIT_SIZE 10 //栈的初始长度
#define STACKINCREMENT 5 //栈的追加长度
typedef struct bitree{
char data;
struct bitree *lchild, *rchild;
}bitree; //二叉树结点定义
typedef struct {
bitree **base;
bitree **top;
int stacksize;
}sqstack; // 链栈结点定义top栈顶 base栈底 且栈元素是指向二叉树结点的二级指针
//建立一个空栈
int initstack(sqstack *s)
{
s->base = (bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree)); //栈底指向开辟空间
if (!s->base) exit(1); //抛出异常
s->top = s->base; //栈顶=栈尾 表示栈空
s->stacksize = STACK_INIT_SIZE; //栈长度为开辟空间大小
return 1;
}
//进栈
int push(sqstack *s, bitree *e)
{
if (s->top - s->base >= s->stacksize) //如果栈满 追加开辟空间
{
s->base = (bitree *)realloc(s->base, (s->stacksize + STACKINCREMENT)* sizeof(bitree));
if (!s->base) exit(1); //抛出异常
s->top = s->base + s->stacksize; //感觉这一句没用
s->stacksize += STACKINCREMENT;
}
*(s->top) = e; s->top++; //进栈 栈顶后移
return 1;