实验三 二叉树的遍历

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档