第七章 树形结构数据结构基本实验算法Word下载.docx

上传人:b****5 文档编号:19444072 上传时间:2023-01-06 格式:DOCX 页数:15 大小:17.86KB
下载 相关 举报
第七章 树形结构数据结构基本实验算法Word下载.docx_第1页
第1页 / 共15页
第七章 树形结构数据结构基本实验算法Word下载.docx_第2页
第2页 / 共15页
第七章 树形结构数据结构基本实验算法Word下载.docx_第3页
第3页 / 共15页
第七章 树形结构数据结构基本实验算法Word下载.docx_第4页
第4页 / 共15页
第七章 树形结构数据结构基本实验算法Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

第七章 树形结构数据结构基本实验算法Word下载.docx

《第七章 树形结构数据结构基本实验算法Word下载.docx》由会员分享,可在线阅读,更多相关《第七章 树形结构数据结构基本实验算法Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

第七章 树形结构数据结构基本实验算法Word下载.docx

\0'

)//str未扫描完时循环

{

switch(ch)

{

case'

('

:

top++;

St[top]=p;

k=1;

break;

//为左节点

)'

top--;

'

k=2;

//为右节点

default:

p=(BTNode*)malloc(sizeof(BTNode));

p->

data=ch;

lchild=p->

rchild=NULL;

if(b==NULL)//p指向二叉树的根结点

b=p;

else//已建立二叉树根结点

{

switch(k)

{

case1:

St[top]->

lchild=p;

case2:

rchild=p;

}

}

}

j++;

ch=str[j];

}

}

BTNode*FindNode(BTNode*b,ElemTypex)//返回data域为x的节点指针

BTNode*p;

if(b==NULL)

returnNULL;

elseif(b->

data==x)

returnb;

else

p=FindNode(b->

lchild,x);

if(p!

=NULL)

returnp;

else

returnFindNode(b->

rchild,x);

BTNode*LchildNode(BTNode*p)//返回*p节点的左孩子节点指针

returnp->

lchild;

BTNode*RchildNode(BTNode*p)//返回*p节点的右孩子节点指针

rchild;

intBTNodeDepth(BTNode*b)//求二叉树b的深度

intlchilddep,rchilddep;

return(0);

//空树的深度为

lchilddep=BTNodeDepth(b->

lchild);

//左孩子深的为lchilddep

rchilddep=BTNodeDepth(b->

rchild);

//右孩子深的为rchilddep

return(lchilddep>

rchilddep)?

(lchilddep+1):

(rchilddep+1);

voidDispBTNode(BTNode*b)//以括号表示法输出二叉树

if(b!

printf("

%c"

b->

data);

if(b->

lchild!

=NULL||b->

rchild!

printf("

("

);

DispBTNode(b->

if(b->

printf("

"

)"

intBTWidth(BTNode*b)//求二叉树b的宽度

struct

intlno;

//节点层次编号

BTNode*p;

//节点指针

}Qu[MaxSize];

//定义顺序非循环队列

intfront,rear;

//定义队首和队尾指针

intlnum,max,i,n;

front=rear=0;

//置队列为空队

rear++;

Qu[rear].p=b;

//根结点指针入队

Qu[rear].lno=1;

//根结点的层次编号为

while(rear!

=front)//此循环通过层次遍历求每个节点的层次

front++;

b=Qu[front].p;

//队头出列

lnum=Qu[front].lno;

=NULL)//左孩子入队

rear++;

Qu[rear].p=b->

Qu[rear].lno=lnum+1;

=NULL)//右孩子入队

max=0;

lnum=1;

i=1;

//lnum从第层开始

while(i<

=rear)//通过比较相同层次的节点数求树的宽度

n=0;

while(i<

=rear&

&

Qu[i].lno==lnum)

n++;

//n累计lnum层中的节点个数

i++;

lnum=Qu[i].lno;

//取一个新的节点层次

if(n>

max)

max=n;

//将最大层次节点数赋给max

returnmax;

//返回max值

return0;

intNodes(BTNode*b)//求二叉树b的节点个数

intnum1,num2;

if(b==NULL)//树空的情况

lchild==NULL&

b->

rchild==NULL)//为叶子节点的情况

return1;

else//其他情况

num1=Nodes(b->

num2=Nodes(b->

return(num1+num2+1);

//返回左右节点数加

intLeafNodes(BTNode*b)//求二叉树b的叶子节点数

else//其他情况

num1=LeafNodes(b->

num2=LeafNodes(b->

return(num1+num2);

//返回左右子树叶子结点数

//主程序

voidmain()

BTNode*b,*p,*lp,*rp;

CreateBTNode(b,"

A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"

printf("

(1)输出二叉树:

"

DispBTNode(b);

printf("

\n"

(2)'

H'

节点:

p=FindNode(b,'

if(p!

lp=LchildNode(p);

if(lp!

左孩子为%c"

lp->

无左孩子"

rp=RchildNode(p);

if(rp!

右孩子为%c"

rp->

无右孩子"

(3)二叉树b的深度:

%d\n"

BTNodeDepth(b));

(4)二叉树b的宽度:

BTWidth(b));

(5)二叉树b的节点个数:

Nodes(b));

(6)二叉树b的叶子结点个数:

LeafNodes(b));

/////////////////////////////////////////////////////////////////////

实验2实现二叉树各种遍历算法

编写一个程序,实现二叉树的先序遍历、中序遍历和后续遍历的各种递归和非递归算法,以及层次遍历的算法。

//数据元素

b,char*str)

case'

if(b==NULL)

else

voidDispBTNode(BTNode*b)

voidPreOrder(BTNode*b)

PreOrder(b->

voidPreOrder1(BTNode*b)

BTNode*St[MaxSize],*p;

inttop=-1;

top++;

St[top]=b;

while(top>

-1)

p=St[top];

top--;

p->

if(p->

top++;

St[top]=p->

voidInOrder(BTNode*b)

InOrder(b->

voidInOrder1(BTNode*b)

p=b;

-1||p!

while(p!

St[top]=p;

p=p->

if(top>

p=St[top];

top--;

voidPostOrder(BTNode*b)

PostOrder(b->

voidPostOrder1(BTNode*b)

BTNode*St[MaxSize];

intflag,top=-1;

//栈指针置初值

do

while(b!

=NULL)//将t的所有左节点入栈

St[top]=b;

b=b->

p=NULL;

//p指向当前节点的前一个已访问的节点

flag=1;

//设置b的访问标记已访问过

while(top!

=-1&

flag)

b=St[top];

//取出当前的栈顶元素

if(b->

rchild==p)//右子树不存在或已被访问,访问之

printf("

//访问*b节点

top--;

p=b;

//p指向刚被访问的节点

else

b=b->

//t指向右子树

flag=0;

//设置未被访问的标记

}while(top!

=-1);

voidTravLevel(BTNode*b)

BTNode*Qu[MaxSize];

intfront,rear;

rear++;

Qu[rear]=b;

while(rear!

=front)

front=(front+1)%MaxSize;

b=Qu[front];

lchild->

rear=(rear+1)%MaxSize;

Qu[rear]=b->

rchild->

BTNode*b;

二叉树b:

DispBTNode(b);

\n\n"

层次遍历:

TravLevel(b);

先序遍历序列:

递归算法:

PreOrder(b);

非递归算法:

PreOrder1(b);

中序遍历序列:

InOrder(b);

InOrder1(b);

后序遍历序列:

PostOrder(b);

PostOrder1(b);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1