设二叉树采用链式存储结构,试设计一个算法计算一棵给定二叉树中叶子结点的数目

设二叉树采用链式存储结构,试设计一个算法计算一棵给定二叉树中叶子结点的数目
设二叉树采用链式存储结构,试设计一个算法计算一棵给定二叉树中叶子结点的数目

#include

#include

#define max 10

typedef struct node{

char data;

node *lchild,*rchild;

}Bitree;

Bitree *B[max];

Bitree *Creatree(){ //建立二叉树

Bitree *T,*S;

char ch;

int front,rear,sign;

sign=0;

front=0;

rear=-1;

T=NULL;

printf("建立二叉树:\n");

ch=getchar();

while(ch!='#'){

if(ch!='@'){ //输入结点不就是虚结点

S=(Bitree

*)malloc(sizeof(Bitree));

S->data=ch;

S->lchild=S->rchild=NULL;

rear++;

B[rear]=S;

if(rear==front){

T=S;

sign++;

}

else{

if(sign%2==1) //寻找父结点

B[front]->lchild=S;

if(sign%2==0){

B[front]->rchild=S;

front++;

}

sign++;

}

}

else{ //输入结点为虚结点

if(sign%2==0)

front++;

sign++;

}

ch=getchar();

}

return T;

}

int Searchleaf(Bitree *T){ //计算叶子数if(T==NULL)

return 0;

else

if(T->lchild==NULL&&T->rchild==NULL) return 1;

else

return(Searchleaf(T->lchild)+Searchleaf(T->rc hild));

}

void visit(Bitree *T){

printf("%c\n",T->data);

}

void Inorder(Bitree *T){ //中序遍历二叉树

if(T!=NULL){

Inorder(T->lchild);

visit(T);

Inorder(T->rchild);

}

}

void main(){

Bitree *T;

T=Creatree();

printf("中序遍历:\n");

Inorder(T);

printf("叶子数%d\n",Searchleaf(T));

}

题目:

设二叉树采用链式存储结构,试设计一个算法计算一棵给定二叉树中叶子结点的数目。问题分析:

本程序要求在一棵二叉树中实现计算叶子结点数目的功能,为完成上述功能,需要解决的关键问题就是建立二叉树过程及查找叶子结点过程。

概要设计:

①建立一个以二叉链表方式存储的二叉树,输入结点信息时按照完全二叉树的结点顺序输入。

②先序遍历二叉树,并判断遍历的根就是否就是叶子结点,若就是并记录叶子结点个数。叶子结点判断条件为:左孩子域与右孩子域都为空。

详细设计:

①建立二叉树时,按照完全二叉树的结点顺序输入,@表示虚结点,#表示输入结束。

若不就是虚结点时,则建立一个新结点,并且将其作为左孩子或右孩子结点连接到它的父结点上(第一个结点无父结点);若就是虚结点,则将空结点(NULL)作为左孩子或右孩子结点连接到它的父节点上。

②查找叶子结点:利用递归先序遍历二叉树方法来查找叶子结点,当遍历一个根结点时判断其左孩子域与右孩子域就是否都为空,若都为空,则该结点就是叶子结点并用记录叶子个数,否则不就是叶子结点。

调试分析及小结:

错误及分析:当按照完全二叉树的结点顺序输入ABCD@E@#后,程序无法运行。经测试,发现在建立二叉树时出现问题。

当扫描到B时,执行else{

if(sign%2==1) {

B[front]->lchild=S;

Sign++;}

if(sign%2==0){

B[front]->rchild=S;

front++;

sign++;

}

} 注:执行上述程序前,sign==1,B[front]指向关键字为A的结点。

当一个if语句段执行完后,关键字为A的结点的左孩子为关键字为B的结点,sign==2。此时本应结束else语句段,但由于sign==2,则第二个if语句条件为真,继续执行,因此导致程序执行出错。

改正:在if语句外置sign++,改正后代码如下:

else{

if(sign%2==1)

B[front]->lchild=S;

if(sign%2==0){

B[front]->rchild=S;

front++;

}

sign++;

}

}

完全二叉树的顺序存储

1 完全二叉树的顺序存储 #include #include class treenode { public: char data; int left, right, parent; treenode(){left=right=parent=-1;} }; int n; //全局变量 void creattree(char a[],treenode t[]) //建二叉树 { for(int i=0;a[i]!='\0';i++) { t[i].data=a[i]; if(2*i+1=n) cout<<"该树中无"<

树结构习题及答案

第5章树 【例5-1】写出如图5-1所示的树的叶子结点、非终端结点、每个结点的度及树深度。 解: (1)叶子结点有:B 、D 、F 、G 、H 、I 、 J 。 (2)非终端结点有:A 、C 、E 。 (3)每个结点的度分别是:A 的度为4,C 的度为2,E 的度为3,其余结点的度为0。 (4)树的深度为3。 【例5-7】如图5-5所示的二叉树,要求: (1)写出按先序、中序、后序遍历得到的结点序列。 (2)画出该二叉树的后序线索二叉树。 解: (1) 先序遍历序列:ABDEFC 中序遍历序列:DEFBAC 后序遍历序列:FEDBCA b a c d e f 图5-5 A B C D E F G H I J 图5-4

(2)其后序线索二叉树如图5-6所示。 5%、、G 、H 的 3.假定一棵三叉树的结点数为50,则它的最小高度为(3.C )。 A.3 B.4 C.5 D.6 4.在一棵二叉树上第4层的结点数最多为(4.D )。 第六步: 25 30 9 9 18 7 12 8 15 27 43 图5-13

A.2 B.4 C.6 D.8 5.用顺序存储的方法将完全二叉树中的所有结点逐层存放在数组中R[1..n],结点R[i]若有左孩子,其左孩子的编号为结点(5.B)。 A.R[2i+1] B.R[2i] C.R[i/2] D.R[2i-1] 6.由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为(6.D)。 A.24 B.48 C.72 D.53 7.线索二叉树是一种(7.C)结构。 A.逻辑 B.逻辑和存储 C.物理 D.线性 8.线索二叉树中,结点p没有左子树的充要条件是(8.B)。 A.p->lc=NULL B.p->ltag=1 C.p->ltag=1且p->lc=NULL D.以上都不对 9.设 10. A. 11. A. 12. A. B. C. D. 13. A. C. 14. A. 15. A. C. 1. 2. 3. 4. 5.由二叉树的先序序列和后序序列可以唯一确定一颗二叉树。(5.×) 6.树的后序遍历与其对应的二叉树的后序遍历序列相同。(6.√) 7.根据任意一种遍历序列即可唯一确定对应的二叉树。(7.√) 8.满二叉树也是完全二叉树。(8.√) 9.哈夫曼树一定是完全二叉树。(9.×) 10.树的子树是无序的。(10.×) 三、填空题 1.假定一棵树的广义表表示为A(B(E),C(F(H,I,J),G),D),则该树的度为_____,树的深度为_____,终端结点的个数为______,单分支结点的个数为______,双分支结点的个数为______,三分支结点的个数为_______,C结点的双亲结点为_______,其孩子结点为_______和_______结点。1.3,4,6,1,1,2,A,F,G

求二叉树的深度叶子结点数总结点数()

#include"malloc.h" #define NULL 0 #include"stdio.h" typedef struct node { char data; struct node *lchild,*rchild; }NODE; int count; NODE *crt_bt_pre()/*二叉树先序创建算法*/ { NODE * bt; char ch; printf("\n\t\t\t"); scanf("%c",&ch); getchar(); if(ch==' ') bt=NULL; else { bt=(NODE*)malloc(sizeof(NODE)); bt->data=ch; printf("\n\t\t\t请输入%c结点的左孩子:",bt->data); bt->lchild=crt_bt_pre(); printf("\n\t\t\t请输入%c结点的右孩子:",bt->data); bt->rchild=crt_bt_pre(); } return(bt); } void Preorder(NODE* bt)/*二叉树先序递归遍历算法*/ { if(bt!=NULL) { printf("\n\t\t\t %c",bt->data); Preorder(bt->lchild); Preorder(bt->rchild); } } void Inorder(NODE* bt) {

if(bt!=NULL) { Inorder(bt->lchild); printf("\n\t\t\t %c",bt->data); Inorder(bt->rchild); } } void Postorder(NODE* bt) { if(bt!=NULL) { Postorder(bt->lchild); Postorder(bt->rchild); printf("\n\t\t\t %c",bt->data); } } int CountLeaf(NODE *bt)/*求二叉树叶子结点数的递归遍历算法*/ { if(bt==NULL) return 0; if(bt->lchild==NULL&&bt->rchild==NULL) count++; CountLeaf(bt->lchild); CountLeaf(bt->rchild); return(count); } int CountNode (NODE* bt)/*求二叉树结点数的递归遍历算法*/ { if(bt==NULL) return 0; else count++; CountNode(bt->lchild); CountNode(bt->rchild); return(count); } int TreeDepth(NODE* bt)/*求二叉树深度的递归遍历算法*/ { int x,y; if(bt==NULL)

二叉树的存储表示

二叉树的存储表示 1二叉树的顺序存储表示 2二叉树的链式存储表示 3三叉链表 1二叉树的顺序存储表示 二叉树的顺序存储结构的定义如下: #define MAXSIZE = 100; //暂定二叉树中节点数的最大值为100 Typedef struct { ElemType *data ; //存储空间基址(初始化时分配空间) Int nodeNum ; //二叉树中节点数 }SqBiTree ; //二叉树的顺序存储结构 为了能在存储结构中反映出节点之间的逻辑关系,必须将二叉树中节点依照一定规律安排在这组存储单元中。对于完全二叉树,只要从根起按层序存储即可。 显然,这种顺序存储结构仅适用于完全二叉树。因为,在最坏的情况下,一个深度为 k 且只有 k 个结点的单支树(树中不存在度为 2 的结点)却需要长度为2k -1的一维数组。 二叉树的顺序存储图如图1所示: 2 6 320 116 5402 106 543216 (a )满二叉树(b )一般二叉树 图1 顺序存储

2二叉树的链式存储表示 二叉树有不同的链式结构,其中最常用的是二叉链表与三叉链表。二叉链表的结点形式如表1所示: 表1链式存储 date域:称为数据域,用于存储二叉树结点中的数据元素, 1child域:称为左孩子指针域,用于存放指向本结点左孩子的指针(左指针)。 rchild域:称为右孩子指针域,用于存放指向本结点右孩子的指针(右指针)二叉链表中的所有存储结点通过它们的左、右指针的链接而形成一个整体。 根指针:每个二叉链表还必须有一个指向根结点的指针。根指针具有标识二叉链表的作用,对二叉链表的访问能从根指针开始。 图2中(a)(b)表示一棵二叉树及其二叉链表。值得注意的是,二叉链表中每个存储结点的每个指针域必须有一个值,这个值或者是指向该结点的一个孩子的指针,或者是空指针NULL。 二叉链表的类型定义如下: Typedef struct btnode *bitreptr; Struct btnode { Datatype data; Bitreptr lchild,rchild; }; Bitreptr root; 若二叉树为空,则root=NULL。若某结点的某个孩子不存在,则相应的指针为空。具有n个结点的二叉树中,一共有2n个指针域,其中只有n-1个用来指向结点的的左右孩子,其余的n+1个指针域为NULL。 在二叉链表这种存储结构上,二叉树的多数基本运算如求根,求左、右孩子等很容易实现。但求双亲运算PARENT(BT,X)的实现却比较麻烦,而且其时间性能不高。

31构建二叉树的二叉链表存储结构

Computer Education教育与教学研究 文章编号:1672-5913(2008)06-0066-03 构建二叉树的二叉链表存储结构 王岁花,岳冬利 (河南师范大学 计算机与信息技术学院,新乡 453007) 摘要:本文根据笔者多年的教学经验,介绍了四种构建二叉树的二叉链表存储结构的方法。 关键词:二叉树;链表;存储结构;递归 中图分类号:G642 文献标识码:B 1 引言 《高等学校计算机科学与技术专业发展战略研究报告暨专业规范》中将“计算机科学与技术”专业名称下的人才培养规格归纳为三种类型、四个不同的专业方向:科学型(计算机科学专业方向)、工程型(包括计算机工程专业方向和软件工程专业方向)、应用型(信息技术专业方向)。“数据结构”课程出现在四个专业方向的核心课程中,而树型结构同样无一例外的出现在了四个专业方向的核心知识单元中。 树型结构描述的是研究对象之间一对多的关系。在存储树时,如果用指针来描述元素之间的父子关系,则由于对每个元素的孩子数量没有限制(最小可以是0,最多可以是树的度d),若结点的结构定义为一个数据域data和d个指针域,则可以证明,有n个结点、度为d的树的多重链表存储结构中,有n*(d-1)+1个空链域,采用这样的存储将造成很大的浪费。 二叉树是树型结构的一种特殊情况,对于它的操作和存储要比树简单的多,且树和森林可以用二叉链表做媒介同二叉树进行相互转换,所以对二叉树的研究就显得特别重要。 二叉树的二叉链表存储是二叉树的一种重要的存储结构,在每一本“数据结构”教材中都占据了一定的篇幅,但对于怎样建立一棵二叉树的二叉链表存储结构,却很少提及。笔者从事“数据结构”课程教学已二十余年,总结出了以下四种构建方法,希望能对同仁和学数据结构的学生有所帮助。通过本文的学习,学生将会对二叉链表和递归有更深入的理解。 2 二叉树的二叉链表存储结构构建方法 假设有关二叉树的二叉链表存储的类型定义如下: typedef struct BiTNode{ // 结点结构ElemType data ;//数据域 struct BiTNode *Lchild ;//左孩子指针 struct BiTNode *Rchild;//右孩子指针} BiTNode ,*BiTree ; 说明:ElemType为二叉树的元素值类型,根据具体情况进行定义,本文假设为char型;BiTNode为结点类型;BiTree为指向BiTNode的指针类型。下面的算法均用类C 描述。 2.1 利用扩展二叉树的先序序列构建 只根据二叉树的先序序列是不能唯一确定一棵二叉树的。针对这一问题,可做如下处理:对二叉树中每个结点的空指针引出一个虚结点,设其值为#,表示为空,把这样处理后的二叉树称为原二叉树的扩展二叉树。扩展二叉树的先序序列可唯一确定这棵二叉树。如图1所示,给出了一棵二叉树的扩展二叉树,以及该扩展二叉树的先序序列。 收稿日期:2007-12-15 作者简介:王岁花,副教授,主要研究方向是语义Web和课程教学论。 项目资助:河南师范大学教学研究基金资助 66

树的存储与遍历操作

重庆邮电大学 课程设计实验报告 班级:1301416 姓名:陈昊 学号:2014214156 指导老师:夏晨洋 课程名称:数据结构 实验时间:2015年10月26日-2015年11月2日实验地点:数字图书馆负一楼B132

实验五树的存储与遍历操作 一、实验目的 1.理解二叉树的逻辑结构; 2.理解二叉树的存储结构特点,掌握二叉树的存储分配要点; 3.掌握二叉树的基本操作及递归实现,深刻领会二叉树遍历操作的非递归实现。 二、主要数据结构描述 class BiTree { public: BiTree( ); //构造函数,初始化一棵二叉树,其前序序列由键盘输入 ~BiTree(void); //析构函数,释放二叉链表中各结点的存储空间 BiNode* Getroot(); //获得指向根结点的指针 void PreOrder(BiNode *root); //前序遍历二叉树 void InOrder(BiNode *root); //中序遍历二叉树 void PostOrder(BiNode *root); //后序遍历二叉树 void LeverOrder(BiNode *root); //层序遍历二叉树 private: BiNode *root; //指向根结点的头指针 BiNode *Creat( ); //有参构造函数调用 void Release(BiNode *root); //析构函数调用 }; 在树的数据结构中,需要一个构造函数来初始化一棵树,采用递归算法建立根节点的左子树和右子树;需要一个析构函数,用来删除存储空间中的数据;需要一个函数用来获得指向根节点的指针;需要四个函数分别对树进行前序遍历、中序遍历、后序遍历和层序遍历,并在程序中显示。 三、算法的基本思想描述 1.构造函数:在构造函数中,利用递归的思想,循环建立根节点的左子树和右子树。时间复杂度为O(n)。 2.析构函数:在析构函数中,利用递归依次释放左子树和右子树。时间复杂度为O(n)。 3.前序遍历:使用递归算法,如果根节点为空就结束。前序遍历根节点的左子树和右子树。时间复杂度为O(n)。 4.后序遍历:使用递归算法,如果根节点为空就结束。后序遍历根节点左子树和右子树。时间复杂度为O(n)。 5.层序遍历:建立一个新的队列,采用递归的方法,先将根节点入队,如果根节点有左孩子结点,就将左孩子结点入队,再将右孩子结点入队,以此类推。时间复杂度为O(n)。 四、程序结果截图

二叉树的顺序存储结构

#include #include #define VirNode ' ' /* 用空格符描述“虚结点”*/ #define MAXSIZE 64 typedef char ElemType; typedefElemTypeSqBitTree[MAXSIZE]; void crebitree(SqBitTreeBT,int n) /* n为二叉树真实结点数*/ { inti,j,m; i=1; m=0; while(m

{ inti,n=0; for(i=1;i<=BT[0]/2;i++) if(BT[i]!=VirNode&&BT[2*i]==VirNode&&BT[2*i+1]==VirNode) n++; for(;i<=BT[0];i++) if(BT[i]!=VirNode) n++; return n; } int countn1(SqBitTree BT) { inti,n=0; for(i=1;i<=BT[0]/2;i++) if(BT[i]!=VirNode&&(BT[2*i]==VirNode&&BT[2*i+1]!=VirNode|| BT[2*i]!=VirNode&&BT[2*i+1]==VirNode)) n++; return n; } int countn2(SqBitTree BT) { inti,n=0; for(i=1;i<=BT[0]/2;i++) if(BT[i]!=VirNode&&BT[2*i]!=VirNode&&BT[2*i+1]!=VirNode) n++; return n; } //主函数 void main() { SqBitTree T; int n; crebitree(T,5); levellist(T); printf("High=%d\n",high(T)); levellist(T); printf("n2=%d\n",countn2(T)); getch(); }

二叉树叶子结点个数计算

计算二叉树叶子结点 1.程序设计简介 已知一棵二叉树,求该二叉树中叶子结点的个数。 2.基本要求 (1)设计二叉树的二叉链表为存储结构 (2)设计求叶子结点个数的递归算法 (3)输入:一颗二叉树 (4)输出:二叉树中叶子结点的个数 3.实现提示 (1)存储设计 二叉树采用二叉链表为存储结构 (2)算法设计 求二叉树中叶子结点个数,即求二叉树的所有结点中左、右子树均为空的结点个数之和。可以将此问题转化为遍历问题,在遍历中“访问一个结点”时判断该结点是不是叶子,若是则将计数器累加。 4.源程序 #include #include using namespace std;

struct BiNode 行与测试 6.调试感想 非递归算法求叶子结点的个数 #include #include using namespace std; struct node { int data; node *lchild; node *rchild; }; node *root=NULL; void mid(node*root,int key=500) { int sum=0; stacks; while(NULL!=root || !()) { if(NULL!=root) {

(root); root=root->lchild; } else { root=(); // cout<data<<" "; if(NULL==root->lchild && NULL==root->rchild) ++sum; (); root=root->rchild; } } cout<data=100; node *a=new node; node *b=new node; node *a1=new node; node *a2=new node; node *b1=new node; node *b2=new node; a->data=200; b->data=300; a1->data=400; a2->data=500; b1->data=600; b2->data=700; root->lchild=a; root->rchild=b; a->lchild=a1; a->rchild=a2;

用二叉树实现存储信息

用二叉树实现存储信息用二叉树 实现存储信息.txt老子忽悠孩子叫 教育,孩子忽悠老子叫欺骗,互 相忽悠叫代沟。▲ 男人这花花世 界,我要用什么颜色来吸引你。 #in elude #inelude using n amespaee std; typedef struct _stude nt { int id; ehar[20] Name; Int Age ; int Math;//(数学成绩)

};//学生结构体 struct treeitem { struct treeitem *lchild; struct treeitem *rchild; struct _stude nt mystude nt; };//二叉树结构体 class Stude nt { public: Stude nt(void); ~Stude nt(void); void Create(struct treeitem *Tnode );// 创建 void Find(struct treeitem *tree,int i);// 查看节点是否存在 void Search(Stude nt &tree);〃查询节点 void Chan ge(struct treeitem *Tno de,i nt i);// 修改 void DeleteNode(struct treeitem *tree,int i);//删除

Stude nt *n ode;// 根节点 private: bool tj; int i_id,i_age,i_math; char c_ch; }; .cpp=== Stude nt::Stude nt(void) { tj=false; } Student::~Stude nt(void) { } void Stude nt::Create(struct treeitem *Tnode)// 创建 1 { ci n>>i」d,c_ch,i_age,i_math; if(id!=null&&ch!="&&age!=null&&math!=n

实验报告二叉树求叶子结点数目(内容清晰)

实验叶子结点的计算 姓名:xxx 班级:xxx) 学号:16130xxxxx 时间2017.10.22 1 问题描述 二叉树叶子节点的计算 1.二叉树的创建 2.二叉树的图形显示 3.二叉树叶子节点的计算 2 结构设计 二叉树叶子结点的计算主要是二叉树的创建,在这里选择的存储结构是一个链式存Data lchild rchild struct BTNode{ int data; BTNode*lchild; BTNode*rchild; }; 3 算法设计 在程序正式编写之前我定义了几个功能函数 (1)指针清空函数,预定义一个指针bt 使lchild和rchild的值分别赋予bt并且使其为空 static int clear(BTNode *bt) { if (bt) { clear(bt->lchild ); clear(bt->rchild ); cout<<"释放了指针"<

{ if(p->lchild==NULL&&p->rchild==NULL)count++; Leaf(p->lchild,count); Leaf(p->rchild,count); } return count; } (2)二叉树的创建 同样是利用递归的方式,输入参数包括指针,左右判断,以及判空条件static int create(BTNode *p,int k ,int end) { BTNode *q; int x; cin>>x; if(x!=end) { q=new BTNode; q->data =x; q->lchild=NULL; q->rchild=NULL; if(k==1)p->lchild=q; if(k==2)p->rchild=q; create(q,1,end); create(q,2,end); } return 0; }; (3)类的构造函数创建树并且输入各结点数值 在这里,采用的时先序遍历法依次输入树中的各结点数值 Step 1:定义新的结构体指针, Step 2:申请动态存储空间; Step 3:输入节点元素,并且指针后移到输入结点的后继结点,end作为结点结束标志; Step 4:重复步骤3,直到输入结束; void BinaryTree::CreateBiTree (int end) { cout<<"请按照先序序列的顺序输入二叉树,-1为空指针域标志:"<>x; if(x==end)return; p=new BTNode;

5.2-3 (有修改)二叉树ADT及存储表示

Content 树 1 二叉树2二叉树的遍历3 树和森林4堆和优先权队列5哈夫曼树及其应用 6

PART TWO 二叉树 ?二叉树的定义和性质 ?特殊二叉树 ?二叉树ADT与存储表示 ?二叉树的基本运算

二叉树ADT ADT BinaryTree{ 数据: 二叉树是结点的有限集合,它或者为空集合,或者由一个根和两棵子树构成,这两棵子树也是二叉树。运算: Create(bt):构造一棵空二叉树bt。 NewNode(x,ln,rn):创建一个新节点,该结点的值为x,ln和rn为该结点的左右孩子结点。 IsEmpty(bt):若二叉树bt为空,则返回TRUE,否则返回FALSE。 ClearTree(bt):清除二叉树bt中的所有结点,使之成为空二叉树。 Root(bt,x):若二叉树bt非空,则获取根结点中的数据,并返回TRUE,否则返回FALSE。 MakeTree(bt,x,left,right):构造一棵二叉树bt,根结点的值为x,left和right为该根结点的左右子树。 PreOrderTree(bt):先序遍历二叉树bt。 InOrderTree(bt):中序遍历二叉树bt。 PostOrderTree(bt):后序遍历二叉树bt。 …… }

性质6: 对完全二叉树中的结点,按照从上到下、从左到右依次顺 序从0开始编号,则对于编号为i的节点而言,可知: ?若i=0,则该结点为根结点 ?若i>0,则该结点的父节点为?(i-1)/2? ?若2i+1<n,则该结点的左孩子为2i+1,否则无左孩子 ?若2i+2<n,则该结点的右孩子为2i+2,否则无右孩子 ?完全二叉树的顺序存储表示: ?结点按从上到下、从左到右,逐层顺序存储于一块连续的存储单元(即数组)?根结点存储在下标为0的位置,其他结点按上述性质中的编号规则依次顺序存储

树结构习题及答案

【例5-1】写出如图5-1所示的树的叶子结点、非终端结点、每个结点的度及树深度。 A B C D E F G H I J 图5-1 解: (1)叶子结点有:B、D、F、G、H、I、J。 (2)非终端结点有:A、C、E。 (3)每个结点的度分别是:A的度为4,C的度为2,E的度为3,其余结点的度为0。 (4)树的深度为3。 【例5-2】一棵度为2的树与一棵二叉树有什么区别? 解:度为2的树有两个分支,但分支没有左右之分;一棵二叉树也有两个分支,但有左右之分,左右子树的次序不能交换。 【例5-3】树与二叉树有什么区别? 解:区别有两点: (1)二叉树的一个结点至多有两个子树,树则不然; (2)二叉树的一个结点的子树有左右之分,而树的子树没有次序。 【例5-4】分别画出具有3个结点的树和三个结点的二叉树的所有不同形态。 解:如图5-2(a)所示,具有3个结点的树有两种不同形态。 图5-2(a) 如图5-2(B)所示,具有3个结点的二叉树有以下五种不同形态。 图5-2(b) 【例5-5】如图5-3所示的二叉树,试分别写出它的顺序表示和链接表示(二叉链表)。 解: (2)该二叉树的二叉链表表示如图5-4所示。

【例5-6】试找出满足下列条件的所有二叉树: (1)先序序列和中序序列相同; (2)中序序列和后序序列相同; (3)先序序列和后序序列相同。 解: (1)先序序列和中序序列相同的二叉树为:空树或者任一结点均无左孩子的非空二叉树; (2)中序序列和后序序列相同的二叉树为:空树或者任一结点均无右孩子的非空二叉树; (3)先序序列和后序序列相同的二叉树为:空树或仅有一个结点的二叉树。 【例5-7】如图5-5所示的二叉树,要求: (1)写出按先序、中序、后序遍历得到的结点序列。 (2)画出该二叉树的后序线索二叉树。 解: (1) 先序遍历序列:ABDEFC 中序遍历序列:DEFBAC 后序遍历序列:FEDBCA (2)其后序线索二叉树如图5-6所示。 b a c d e f 图5-5 图5-6

实验五--二叉树的存储结构和基本操作

实验五二叉树的存储表示和基本操作 实验内容 1. 二叉树的二叉链表的存储结构 —————二叉树的二叉链表存储表示———————— typedef struct node { ElemType data; /*数据元素*/ struct node *lchild; /*指向左孩子*/ struct node *rchild; /*指向右孩子*/ } BTNode; 2. 二叉树的基本操作 (1)创建操作:创建一棵二叉树。 (2)查找操作:查找二叉树中值为x的结点。 (3)查找左孩子操作:查找二叉树中值为x的结点的左孩子。 (4)查找右孩子操作:查找二叉树中值为x的结点的右孩子。 (5)求深度操作:求二叉树的深度。 (6)求宽度操作:求二叉树的宽度。 (7)求结点个数操作:求二叉树的结点个数。 (8)求叶子结点个数操作:求二叉树的叶子结点个数。 (9)输出操作:以括号表示法输出二叉树。 3. 链式队列操作实现的步骤 (1)实现将链式队列的存储结构和基本操作程序代码。 (2)实现main主函数。 4.程序代码完整清单 #include #include #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; /*数据元素*/ struct node *lchild; /*指向左孩子*/ struct node *rchild; /*指向右孩子*/ } BTNode; //基本操作函数声明 void CreateBTNode(BTNode *&b,char *str); /*创建一棵二叉树*/ BTNode *FindNode(BTNode *b,ElemType x); /*查找二叉树的结点*/ BTNode *LchildNode(BTNode *p); /*查找二叉树结点的左孩子*/ BTNode *RchildNode(BTNode *p); /*查找二叉树结点的右孩子*/ int BTNodeDepth(BTNode *b); /*求二叉树的深度*/

数据结构实验指导书 二叉树两种存储结构的应用

一、实验名称:二叉树两种存储结构的应用 二、实验目的和要求: 1.掌握二叉树的遍历思想及二叉树的存储实现。 2.掌握二叉树的基本操作:建立二叉树、二叉树的遍历 3.选择一种形式完成二叉树的显示 4.掌握二叉树的常见算法的程序实现 5.实验报告中要写出测试数据、错误分析以及收获 三、上机实验内容一:二叉树的建立及相关算法的实现 1.完成的功能包括如下几点: ①编程实现建立一棵二叉树,然后对其进行先序、中序和后序遍历。 分析:将要输入的二叉树按照其对应的完全二叉树的顺序输入,若当前位置不存在结点则输入@ ②显示二叉树 ③求二叉树的高度及二叉树的叶子个数等等 ④在主函数中设计一个简单的菜单,分别调试上述算法 四、上机实验内容二:哈夫曼编码/译码系统 1.要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。 2.设计分析 在本例中的算法主要有:哈夫曼树的建立;哈夫曼编码的生成;对编码信息的翻译。要求设置发送者和接收者两个功能。 发送者的功能包括: ①输入待传送的字符信息;②统计字符信息中出现的字符类数和各字符出现的次数(频率);③根据字符的种类数和各字符出现的次数建立哈夫曼树;④利用以上哈夫曼树求出各字符的哈夫曼编码;⑤将字符信息转换成对应的编码信息进行传送。 接收者的功能包括: ①接收发送者传送来的编码信息;②利用上述哈夫曼树对编码进行翻译,即将编码信息还原成发送前的字符信息。 3.结点的类型定义 ①哈夫曼树的存储结构类型定义为:

typedef struct { char data; /*编码对应的字符*/ int weight; /*结点的权值*/ int lchild,rchild,parent;/*左右孩子及双亲的下标*/ }HTNode; ②哈夫曼编码的存储结构类型定义为: typedef struct { char bits[N]; /*存放哈夫曼编码的字符数组*/ int start; /*记录编码的起始位置,因为每种字符的编码长度不同*/ }HCode; 说明:只占用2个课内学时,学生可利用开放实验室利用课余时间完成本次实验内容。

设二叉树采用链式存储结构,试设计一个算法计算一棵给定二叉树中叶子结点的数目

#include #include #define max 10 typedef struct node{ char data; node *lchild,*rchild; }Bitree; Bitree *B[max]; Bitree *Creatree(){ //建立二叉树 Bitree *T,*S; char ch; int front,rear,sign; sign=0; front=0; rear=-1; T=NULL; printf("建立二叉树:\n"); ch=getchar(); while(ch!='#'){ if(ch!='@'){ //输入结点不就是虚结点 S=(Bitree *)malloc(sizeof(Bitree)); S->data=ch; S->lchild=S->rchild=NULL; rear++; B[rear]=S; if(rear==front){ T=S; sign++; } else{ if(sign%2==1) //寻找父结点 B[front]->lchild=S; if(sign%2==0){ B[front]->rchild=S; front++; } sign++; } } else{ //输入结点为虚结点 if(sign%2==0) front++; sign++; } ch=getchar(); } return T; } int Searchleaf(Bitree *T){ //计算叶子数if(T==NULL) return 0; else if(T->lchild==NULL&&T->rchild==NULL) return 1; else return(Searchleaf(T->lchild)+Searchleaf(T->rc hild)); } void visit(Bitree *T){ printf("%c\n",T->data); } void Inorder(Bitree *T){ //中序遍历二叉树 if(T!=NULL){ Inorder(T->lchild); visit(T); Inorder(T->rchild); } } void main(){ Bitree *T; T=Creatree(); printf("中序遍历:\n"); Inorder(T); printf("叶子数%d\n",Searchleaf(T)); }

二叉树存储分类

二叉树的存储分类 【摘要】本篇论文主要包含以下几个方面:二叉树的定义(在树的基础上),二叉树的性质,二叉树的存储结构,二叉树的遍历,由浅如深的介绍了二叉树的主要内容和结构特性、程序实现,同时文章多处用到图示的方法将抽象的计算方法变成教为直观的图解。在文章的最后还做了简单的总结,让人们对二叉树在生活中的应用及未来的发展有了一定的了解。 数据结构中二叉树对解决生活问题有着很大的帮助,因此,我们更应该深入的学习和了解二叉树的原理及实际的应用,而这当中又以二叉树的存储为重中之重,因此熟练掌握二叉树的存储分类为以后更方便的解决计算机相关问题做好铺垫,只有详细学习二叉树,了解二叉树的存储结构,才能更好的完成以后将要面临的任务。 【关键词】二叉树,二叉树的顺序存储,二叉树的链式存储 Abstract: This thesis mainly includes the following aspects: binary tree definition (on the base of the tree), the nature of the binary tree, the storage structure of the binary tree, binary tree traversal, achieved by such as the shallow deep introduced binary tree of the main content and structure characteristics, program. At the same time, the number of used calculation method of graphical representation of the abstract into teaching visual graphic. At the end of the article also made a simple summary, so that people on the two fork tree in the life of the application and the future development of a certain understanding. Binary tree data structure to solve the problem of life has a great help. Therefore, we should be more in-depth study and understanding of binary tree theory and practical application, and this and the binary tree storage as the most important, therefore master binary tree storage classification is more convenient for computer to solve the problems related to pave the way, only the detailed study of binary tree, understand the storage structure of the binary

二叉树链式存储结构 第六章实验报告

实验名称:二叉树链式存储结构 实验类型:验证性实验 班级:20102111 学号:2010211102 姓名: 实验日期:2012.5.27 1.问题描述 二叉链表的C语言描述; 基本运算的算法——建立二叉链表、先序遍历二叉树、中序遍历二叉树、后序遍历二叉树、后序遍历求二叉树深度。 2.数据结构设计 typedef struct Bitnode { char data; struct Bitnode *lchild,*rchild; }Bitnode,*Bitree; 3.算法设计 建立二叉链表:void createBitree(Bitree &T) { char ch; if((ch=getchar())=='#') T=NULL; else{T=(Bitnode*)malloc(sizeof(Bitnode)); T->data=ch; createBitree(T->lchild); createBitree(T->rchild); } } 先序遍历二叉树:void preorder(Bitree &T) { if(T!=NULL) {printf("%c",T->data); preorder(T->lchild); preorder(T->rchild);}}

中序遍历二叉树:void inorder(Bitree &T) {if(T!=NULL) { inorder(T->lchild); printf("%c",T->data); inorder(T->rchild); } 后序遍历二叉树:void postorder(Bitree &T) { if(T!=NULL) {postorder(T->lchild); postorder(T->rchild); printf("%c",T->data); } }//后序遍历 后序遍历求二叉树深度:int Depth(Bitree &T) {//返回深度 int d,dl,dr; if(!T) d=0; else {dl=Depth(T->lchild); dr=Depth(T->rchild); d=1+(dl>dr?dl:dr) ; } return d; } 4.运行、测试与分析 运行程序,显示菜单, (1)如图1.1: 图1.1 (2)结果图1.2: 图1.2

相关文档
最新文档