实验三 二叉树的遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业2
1、已知一棵二叉树的中序序列和后序序列分别为c,b,a,e,d,h,g,j,i,f 和c,b,e,h,j,i,g,f,d,a ,
画出这棵二叉树,并写出其先序遍历序列,然后画出其先序线索化后的二叉链表。
2、给定一组数列(10,18,16,25,6, 9,16)分别代表字符A,B,C,D,E,F,G出现的频度,试画出哈夫曼树,给出各字符的编码值
实验三二叉树操作
一、实验目的
1.进一步掌握指针变量的含义。
2.掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。
3.掌握用指针类型描述、访问和处理二叉树的运算。
二、实验要求
1.认真阅读和掌握本实验的参考程序。
2.按照对二叉树的操作需要,在创建好二叉树后再通过遍历算法验证创建结果。
3.保存程序的运行结果,并结合程序进行分析。
三、实验内容
以下参考程序是按完全二叉树思想将输入的字符串生成二叉树,并通过遍历来验证二叉树创建正确与否,但不能创建非完全二叉树,请认真研究该程序,然后模仿教材例 6.4初始化方式创建二叉树:所有的空指针均用#表示,如教材图6-13对应的二叉树,建立时的初始序列为:AB#D##CE##F##。
程序:
// 0508.cpp : 定义控制台应用程序的入口点。
//
#include"stdafx.h"
#define max 30
#define NULL 0
#include
#include
typedef struct BNode
{
char data; /*数据域 */
struct BNode *lchild,*rchild;; //指向左右子女
}Bnode,*BTree;
void preorder(BTree t); //声明先根遍历函数
void inorder(BTree t); //声明中根遍历函数
void postorder(BTree t);//声明后根遍历函数
int leafs(BTree t); //声明求叶子数函数
int treedeep(BTree t); //声明求树的深度函数
BTree swap(BTree t); //声明交换二叉树的所有结点的左右子树的函数
//以加入空结点的先序序列输入,构造二叉链表
BTree cre_tree()
{
BTree p;
char ch;
ch=getchar();
if(ch=='#') p=NULL;
else
{
p=(BTree)malloc(sizeof(Bnode));//生成新结点
p->data=ch;
p->lchild=cre_tree();//创建新结点的左子树
p->rchild=cre_tree();//创建新结点的右子树
}
return p;
}
void main()
{
BTree root;//根结点
printf("请输入结点序列:\n");
root=cre_tree();
printf("\n");
//先根遍历
printf("\n先根遍历结果:");
preorder(root);
printf("\n");
//中根遍历
printf("\n中根遍历结果:");
inorder(root);
printf("\n");
//后根遍历
printf("\n后根遍历结果:");
postorder(root);
printf("\n");
printf("\n叶子数为:%d\n",leafs(root));
printf("\n树的深度为:%d\n",treedeep(root));
printf("\n交换左右子树后先序遍历序列为:");
preorder(swap(root));
printf("\n\n");
}
void preorder(BTree t)
{
if(t!=NULL)
{
printf(" %c ",t->data);
if(t->lchild)
{
preorder(t->lchild);
}
if(t->rchild)
{
preorder(t->rchild);
}
}
}
void inorder(BTree t)
{
if(t!=NULL)
{
inorder(t->lchild);
printf(" %c ",t->data);
inorder(t->rchild);
}
}
void postorder(BTree t)
{
if(t!=NULL)
{
postorder(t->lchild);
postorder(t->rchild);
printf(" %c ",t->data);
}
}
int leafs(BTree b)//求叶子数
{
int num1,num2;
if(b==NULL) return (0);
else if(b->lchild==NULL && b->rchild==NULL) return (1);
else
{
num1=leafs(b->lchild);
num2=leafs(b->rchild);
return(num1+num2);
}
}
int treedeep(BTree p)//求树的深度
{
int ldeep,rdeep,deep;
if(p==NULL) deep=0;
else
{
ldeep=treedeep(p->lchild);
rdeep=treedeep(p->rchild);