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