数据结构 二叉树Word格式文档下载.docx
《数据结构 二叉树Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构 二叉树Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
回答以下问题:
1、二叉树的二叉链表存储表示。
/*---二叉树的二叉链表存储表示---*/
typedefstructBTNode
{
chardata;
/*结点数据*/
structBTNode*lchild;
/*左孩子指针*/
structBTNode*rchild;
/*右孩子指针*/
}*BiTree;
2、二叉树的三种基本遍历方式。
/*先序遍历二叉树,补充递归算法*/
voidPreOrder(BiTreep)
if(p!
=NULL);
{
printf("
%c"
p->
data);
//访问根节点
PreOrder(p->
lchild);
//先序遍历左子数
rchild);
//先序遍历右子数
}
}/*PreOrder*/
/*中序遍历二叉树,补充递归算法*/
voidInOrder(BiTreep)
InOrder(p->
//中序遍历左子数
//中序遍历右子数
}/*InOrder*/
/*后序遍历二叉树,补充递归算法*/
voidPostOrder(BiTreep)
PostOrder(p->
//后序遍历左子数
//后序遍历右子数
}/*PostOrder*/
3、解释哈夫曼树和带权路径长度WPL。
哈夫曼树,是指权值为W1、W2、….Wn的n个叶节点所构成的二叉树中带权路径长度最小的二叉树。
从树根结点到到该结点之间的路径长度与该结点上权的乘积称为结点的带权路径长度,通常记作:
WPL=Σ(n,i=1)WiLi
【实验内容和要求】
1、编写程序exp6_1.c,实现二叉树的链式存储及基本操作。
以下图所示的二叉树实现二叉树的二叉链表存储及基本操作,回答下列问题,补充完整程序,并调试运行验证结果。
(1)按照先序序列建立该二叉树。
读入的字符序列应为:
A,B,C,*,*,D,E,*,G,*,*,F,*,*,*(*表示空指针)。
(2)该二叉树的三种遍历序列:
先序序列:
A,B,C,D,E,G,F;
中序序列:
C,B,E,G,D,F,A;
后序序列:
C,G,E,F,D,B,A;
(3)按层次遍历该二叉树,得到的序列为:
A,B,C,D,E,F,G
(4)该二叉树的深度为5。
(5)该二叉树的叶子结点数为:
______3_____。
(6)交换该二叉树所有结点的左右次序得到的新二叉树为:
(画出新二叉树的图)
(7)新二叉树的三种遍历序列分别为:
A,B,D,C,F,G,E;
D,B,F,G,C,E,A;
D,G,F,E,C,B,A;
exp6_1.c参考程序如下:
#include<
stdio.h>
malloc.h>
#defineMAX20
chardata;
}*BiTree;
/*---非递归遍历辅助队列---*/
typedefstructSqQueue
BiTreedata[MAX];
intfront,rear;
}SqQueue;
voidcreateBiTree(BiTree*t);
/*先序遍历创建二叉树*/
voidPreOrder(BiTreep);
/*先序遍历二叉树*/
voidInOrder(BiTreep);
/*中序遍历二叉树*/
voidPostOrder(BiTreep);
/*后序遍历二叉树*/
voidRPreorder(BiTreep);
/*先序遍历的非递归算法*/
voidRInorder(BiTreep);
/*中序遍历的非递归算法*/
voidRPostorder(BiTreep);
/*后序遍历的非递归算法*/
intdepth(BiTreet);
/*求二叉树的深度算法*/
BiTreegettreenode(charx,BiTreelptr,BiTreerptr);
/*后序复制二叉树-建立结点*/
BiTreecopytree(BiTreet);
/*以后序遍历的方式复制二叉树*/
BiTreeswap(BiTreeb);
/*交换二叉树的结点的左右孩子*/
voidccOrder(BiTreet);
/*利用循环队列实现层次遍历*/
intLeaves(BiTreet);
/*统计二叉树叶子结点(递归)*/
voidrelease(BiTreet);
/*释放二叉树*/
/*先序遍历创建二叉树*/
voidcreateBiTree(BiTree*t)
chars;
BiTreeq;
\npleaseinputdata:
"
);
s=getchar();
getchar();
/*扔掉存在键盘缓冲区的输入结束回车符*/
if(s=='
#'
)/*子树为空则返回*/
*t=NULL;
return;
else
q=(BiTree)malloc(sizeof(structBTNode));
if(q==NULL)
Memoryallocfailure!
exit(0);
q->
data=s;
*t=q;
createBiTree(&
q->
/*递归建立左子树*/
/*递归建立右子树*/
}/*createBiTree*/
=NULL)
/*先序遍历的非递归算法*/
voidRPreorder(BiTreep)
BiTreestack[MAX],q;
inttop=0,i;
for(i=0;
i<
MAX;
i++)
stack[i]=NULL;
/*初始化栈*/
q=p;
while(q!
q->
if(q->
rchild!
stack[top++]=q->
rchild;
/*右指针进栈*/
lchild!
q=q->
lchild;
/*顺着左指针继续向下*/
if(top>
0)
q=stack[--top];
/*左子树访问完,出栈继续访问右子树结点*/
q=NULL;
}/*RPreorder*/
/*中序遍历的非递归算法*/
voidRInorder(BiTreep)
//定义节点栈和搜索指针
inttop=0;
do
while(q)//左链所有节点入栈
stack[top++]=q;
//访问根
}while(q||top!
=0);
}/*RInorder*/
/*后序遍历的非递归算法*/
voidRPostorder(BiTreep)
inti,top=0,flag[MAX];
i++)/*初始化栈*/
flag[i]=0;
=NULL||top!
=0)
if(q!
=NULL)/*当前结点进栈,先遍历其左子树*/
stack[top]=q;
flag[top]=0;
top++;
while(top)
if(flag[top-1]==0)/*遍历结点的右子树*/
q=stack[top-1];
flag[top-1]=1;
break;
/*遍历结点*/
if(top==0)break;
}/*RPostorder*/
/*求二叉树的深度算法,补充递归算法*/
intdepth(BiTreet)
{intlc,rc;
if(t==NULL)
return0;
//若为空树,则返回零
lc=depth(t->
//递归求t的左子树深度
rc=depth(t->
//递归求t的右子树深度
if