您的当前位置:首页实现二叉树的各种遍历算法实验报告

实现二叉树的各种遍历算法实验报告

来源:飒榕旅游知识分享网
实现二叉树的各种遍历算法实验报告

实现二叉树的各种遍历算法实验报告 一实验题目: 实现二叉树的各种遍历算法 二实验要求:

2.1:<1)输出二叉树 b

(2)输出H节点的左右孩子节点值 (3)输出二叉树b 的深度 (4)输出二叉树 b的宽度 (5)输出二叉树 b的节点个数 (6)输出二叉树 b的叶子节点个数 (7)释放二叉树 b

2.2:<1)实现二叉树的先序遍历 (2)实现二叉树的中序遍历 (3)实现二叉树的后序遍历 三实验内容:

3.1 树的抽象数据类型: ADT Tree{

数据对象D:D是具有相同特性的数据元素的集合。 数据关系 R:若D为空集,则称为空树; 若D仅含有一个数据元素,则R为空集,否则 R={H},H是如下二元关系:

(1> 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;

(2> 若D-{root}≠NULL,则存在D-{root}的一个划分 D1,D2,D3, …,Dm(m>0>,对于任意∈H。b5E2RGbCAP

(3> 对应于D-{root}的划分,H-{,…,}有唯一的一个划分H1,H2,…,Hm(m>0>,对任意j≠k(1≤j,k≤m>有Hj∩Hk=NULL,且对任

j≠k(1≤j,k≤m>有

Dj∩Dk=NULL,且对任意的i(1≤i≤m>,唯一存在数据元素xi∈Di有

意i(1≤i≤m>,Hi是Di上的二元关系,(Di,{Hi}>是一棵符合本定义的树,称为根root的子树。p1EanqFDPw

基本操作P: InitTree(&T>。

操作结果:构造空树T。DestroyTree(&T>。 初始条件:树T存在。操作结果:销毁树T。 CreateTree(&T,definition>。

初始条件:definition给出树T的定义。 操作结果:按definition构造树T。 ClearTree(&T>。 初始条件:树T存在。 操作结果:将树T清为空树。 TreeEmpty(T>。 初始条件:树T存在。

操作结果:若T为空树,则返回TRUE,否则返回FALSE。 TreeDepth(T>。 Root(T>。

初始条件:树T存在。操作结果:返回T的根。 Value(T,cur_e>。

初始条件:树T存在,cur_e是T中某个结点。 操作结果:返回cur_e的值。 Assign(T,cur_e,value>。

初始条件:树T存在,cur_e是T中某个结点。 操作结果:结点cur_e赋值为value。 Parent(T,cur_e>。

初始条件:树T存在,cur_e是T中某个结点。

操作结果:若cur_e是T的非根结点,则返回它的双亲,否则函数值为“空”。

LeftChild(T,cur_e>。

初始条件:树T存在,cur_e是T中某个结点。

操作结果:若cur_e是T的非叶子结点,则返回它的最左孩子,否则返回“空”。

RightSibling(T,cur_e>。

初始条件:树T存在,cur_e是T中某个结点。

操作结果:若cur_e有右兄弟,则返回它的右兄弟,否则返回“空”。

InsertChild(&T,&p,I,c>。

初始条件:树T存在,p指向T中某个结点,1≤i≤p指结点的度+1,非空树c与T不相交。

操作结果:插入c为T中p指结点的第i棵子树。 DeleteChild(&T,&p,i>。

初始条件:树T存在,p指向T中某个结点,1≤i≤p指结点的度。 操作结果:删除T中p所指结点的第i棵子树。 TraverseTree(T,visit(>>。

初始条件:树T存在,visit是对结点操作的应用函数。

操作结果:按某种次序对T的每个结点调用函数visit(>一次且至多一次。一旦visit(>失败,则操作失败。DXDiTa9E3d

}ADT Tree

3.2存储结构的定义。 typedef struct node {

char data。

struct node *lchild。 struct node *rchild。 }BTNode。 3.3基本操作实现:

void Insertnode(BTNode *&p,int &i,char * str> {

int judge = 0。

if(str[i]>='A'&&str[i]<='Z'>

judge++。

p = (BTNode *>malloc(sizeof(BTNode>>。 p->lchild=NULL。 p->rchild=NULL。 p->data = str[i]。 i++。 }

if(str[i]=='\\0'> { return 。 }

if(str[i]=='('> { i++。 if(!judge> {

p = (BTNode *>malloc(sizeof(BTNode>>。 p->lchild=NULL。 p->rchild=NULL。 }

Insertnode(p->lchild,i,str>。 Insertnode(p->rchild,i,str>。 }

if(str[i]==','||str[i]=='>'> { i++。 return 。 } }

/** 由STR创建二叉链 **/

void CreateBTNode(BTNode *&b,char * str> {

int i = 0。

Insertnode(b,i,str>。 ///以递归形式插入数据,i 会跟着变化} /** 查找e的节点指针 **/

BTNode * FindNode(BTNode * p, char e> {

if(p==NULL> return NULL。 if(p->data==e> return p。 else

BTNode *b = FindNode(p->lchild,e>。 if(b!=NULL> return b。 else

return FindNode(p->rchild,e>。 } }

/** 输出二叉树 **/

void DispBTNode(BTNode * b> {

if(b!=NULL> {

printf(\"%c\。

if(b->lchild!=NULL || b->rchild!=NULL> { printf(\"<\">。

DispBTNode(b->lchild>。

if(b->rchild != NULL>printf(\",\">。 DispBTNode(b->rchild>。 printf(\")\">。

} } }

/** 深度 **/

int BTNodeDepth(BTNode *b> {

if(b==NULL> return 0。 else {

int l = BTNodeDepth(b->lchild>。 int r = BTNodeDepth(b->rchild>。 return l>r?l+1:r+1。 } }

void search(BTNode *p,int *a,int k> {

if(p!=NULL> { a[k]++。

search(p->lchild,a,k+1>。 search(p->rchild,a,k+1>。 }

/** 求二叉树的宽度 **/ int BTWidth(BTNode * b> {

int a[maxx], i, kmax = 0。 for(i = 0。i < maxx。 ++i> a[i] = 0。 int k = 0。

search(b,a,k>。

for(i = 0。i < maxx。 ++i> if(a[i]>kmax> kmax = a[i]。 return kmax。 }

/** 求二叉树的节点个数 **/ int Nodes(BTNode *b> {

if(b==NULL> return 0。

else if(b->lchild == NULL && b->rchild == NULL> return 1。 else {

int l = Nodes(b->lchild>。 int r = Nodes(b->rchild>。 return l + r + 1。 } }

/** 求叶子节点个数 **/ int leafNodes(BTNode * b> {

if(b==NULL> return 0。

else if(b->lchild == NULL && b->rchild == NULL> return 1。 else {

int l = leafNodes(b->lchild>。 int r = leafNodes(b->rchild>。 return l + r。 }

}

void DestroyBTNode(BTNode *&b> {

if(b!=NULL>

DestroyBTNode(b->lchild>。 DestroyBTNode(b->rchild>。 free(b>。 } }

3.4解题思路:

1 树的先序遍历:递归算法,先输出根节点,再以左子树进行递归最后以右子树进行递归。非递归算法,用栈模拟整个递归过程。RTCrpUDGiT

2 树的中序遍历:递归算法,先以左子树进行递归,再输出根节点,最后以右子树进行递归。非递归算法,同上。5PCzVD7HxA

3 树的后序遍历:递归算法,先以左子树进行递归,再后以右子树进行递归,最后输出根节点。非递归算法,同上。jLBHrnAILg

3.5解题过程: 实验源代码如下:

3.5.1实现二叉树的各种基本运算 #include #include #include #include

#define maxx 100 using namespace std。 typedef struct node {

char data。

struct node *lchild。

struct node *rchild。 }BTNode。

void Insertnode(BTNode *&p,int &i,char * str> {

int judge = 0。

if(str[i]>='A'&&str[i]<='Z'> {

judge++。

p = (BTNode *>malloc(sizeof(BTNode>>。 p->lchild=NULL。 p->rchild=NULL。 p->data = str[i]。 i++。 }

if(str[i]=='\\0'> { return 。 } { i++。 if(!judge> {

p = (BTNode *>malloc(sizeof(BTNode>>。 p->lchild=NULL。 p->rchild=NULL。 }

Insertnode(p->lchild,i,str>。 Insertnode(p->rchild,i,str>。 }

if(str[i]==','||str[i]=='>'>

{ i++。 return 。 } }

/** 由STR创建二叉链 **/

void CreateBTNode(BTNode *&b,char * str> {

int i = 0。

Insertnode(b,i,str>。 ///以递归形式插入数据,i 会跟着变化} /** 查找e的节点指针 **/

BTNode * FindNode(BTNode * p, char e> {

if(p==NULL> return NULL。 if(p->data==e> return p。 else {

BTNode *b = FindNode(p->lchild,e>。 if(b!=NULL> return b。 else

return FindNode(p->rchild,e>。 } }

/** 输出二叉树 **/

void DispBTNode(BTNode * b> {

if(b!=NULL>

printf(\"%c\。

if(b->lchild!=NULL || b->rchild!=NULL> { printf(\"<\">。

DispBTNode(b->lchild>。

if(b->rchild != NULL>printf(\",\">。 DispBTNode(b->rchild>。 printf(\")\">。 } } }

/** 深度 **/

int BTNodeDepth(BTNode *b> {

if(b==NULL> return 0。 else {

int l = BTNodeDepth(b->lchild>。 int r = BTNodeDepth(b->rchild>。 return l>r?l+1:r+1。 } }

void search(BTNode *p,int *a,int k> {

if(p!=NULL> { a[k]++。

search(p->lchild,a,k+1>。 search(p->rchild,a,k+1>。 } }

/** 求二叉树的宽度 **/ int BTWidth(BTNode * b> {

int a[maxx], i, kmax = 0。 for(i = 0。i < maxx。 ++i> a[i] = 0。 int k = 0。 search(b,a,k>。

for(i = 0。i < maxx。 ++i> if(a[i]>kmax> kmax = a[i]。 return kmax。

/** 求二叉树的节点个数 **/ int Nodes(BTNode *b> {

if(b==NULL> return 0。

else if(b->lchild == NULL && b->rchild == NULL> return 1。 else {

int l = Nodes(b->lchild>。 int r = Nodes(b->rchild>。 return l + r + 1。 } }

/** 求叶子节点个数 **/ int leafNodes(BTNode * b> {

if(b==NULL> return 0。

else if(b->lchild == NULL && b->rchild == NULL> return 1。 else {

int l = leafNodes(b->lchild>。 int r = leafNodes(b->rchild>。 return l + r。 } }

void DestroyBTNode(BTNode *&b> {

if(b!=NULL> {

DestroyBTNode(b->lchild>。 DestroyBTNode(b->rchild>。 free(b>。 } }

int main( > {

BTNode *root, *p, *lp, *rp。

CreateBTNode(root,\"A(B(D,E(H(J,K(L,M(,N>>>>>,C(F,G(,I>>>\">。xHAQX74J0X

printf(\"二叉树:\\n\">。 DispBTNode(root>。 puts(\"\">。

printf(\"<2)H节点:\">。 p = FindNode(root,'H'>。 if(p!=NULL> {

lp = p->lchild。 if(lp != NULL> {

printf(\"左孩子为 %c \。 } else {

printf(\"无左孩子\">。 }

rp = p->rchild。 if(rp != NULL> {

printf(\"右孩子为 %c \。 } else {

printf(\"无右孩子\">。 } }

puts(\"\">。

printf(\"<3)二叉树的深度: %d\\n\。 printf(\"<4)二叉树的宽带: %d\\n\。 printf(\"<5)二叉树的节点数:%d\\n\。

printf(\"<6)二叉树的叶子节点个数:%d\\n\。 printf(\"<7)释放二叉树\\n\">。

DestroyBTNode(root>。 return 0。 }

3.5.2二叉树的三序遍历 #include

#include

#define maxsize 100 typedef char Elemtype。 typedef struct node {

Elemtype data。 struct node *lchild。 }BTnode。

void CreateBTnode(BTnode *&b,char *str> {

BTnode *st[maxsize], *p = NULL。 int top = - 1, k, j = 0。 char ch。 b = NULL。 ch = str[j]。 while(ch!='\\0'> {

if(ch == '('> { top++。 st[top] = p。 k = 1。 }

else if(ch == '>'> { top--。 }

else if(ch == ','> { k = 2。

} else {

p=(BTnode *>malloc(sizeof(BTnode>>。 p->data = ch。p->lchild = p->rchild = NULL。 if(b == NULL> b = p。 else {

if(k == 1>

st[top]->lchild = p。 else if(k == 2> st[top]->rchild = p。 } } j++。 ch = str[j]。 } }

void PreOrder(BTnode *p> if(p!=NULL> {

printf(\" %c\。 PreOrder(p->lchild>。 PreOrder(p->rchild>。 } }

void InOrder(BTnode *p> {

if(p!=NULL>

{

InOrder(p->lchild>。 printf(\" %c\。 InOrder(p->rchild>。 } }

void PostOrder(BTnode *p> {

if(p!=NULL> {

PostOrder(p->lchild>。 PostOrder(p->rchild>。 printf(\" %c\。 } }

void PreOrder1(BTnode *p> {

BTnode *st[maxsize], *b。 int top = -1。 if(p != NULL> {

因篇幅问题不能全部显示,请点此查看更多更全内容