用递归和非递归算法实现二叉树地三种遍历Word下载.docx
- 文档编号:13313568
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:16
- 大小:79.69KB
用递归和非递归算法实现二叉树地三种遍历Word下载.docx
《用递归和非递归算法实现二叉树地三种遍历Word下载.docx》由会员分享,可在线阅读,更多相关《用递归和非递归算法实现二叉树地三种遍历Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
数据关系R:
假如D为空集,如此R为空集,称binarytree为空二叉树;
假如D不为空集,如此R为{H},H是如下二元关系;
(1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;
(2)假如D-{root}不为空,如此存在D-{root}={D1,Dr},且D1∩Dr为空集;
(3)假如D1不为空,如此D1中存在唯一的元素x1,<
root,x1>
∈H,且存在D1上的关系H1是H的子集;
假如Dr不为空集,如此Dr中存在唯一的元素Xr,<
root,Xr>
∈H,且存在Dr上的关系Hr为H的子集;
H={<
<
H1,Hr};
(4)(D1,{H1})是一颗符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一颗符合本定义的二叉树,称为根的右子树。
根本操作:
Creatbitree(&
S,definition)
初始条件:
definition给出二叉树S的定义
操作结果:
按definition构造二叉树S
counter(T)
初始条件:
二叉树T已经存在
操作结果:
返回二叉树的总的结点数
onecount(T)
返回二叉树单分支的节点数
Clearbintree(S)
二叉树S已经存在
将二叉树S清为空树
Bitreeempty(S)
假如S为空二叉树,如此返回TRUE,否如此返回FALSE
Bitreedepth(S,&
e)
返回S的深度
Parent(S)
二叉树S已经存在,e是S中的某个结点
假如e是T的非根结点,如此返回它的双亲,否如此返回空
Preordertraverse(S)
二叉树S已经存在,Visit是对结点操作的应用函数。
先序遍历S,对每个结点调用函数visit一次且仅一次。
一旦visit失败,如此操作失败。
Inordertraverse(S,&
中序遍历S,对每个结点调用函数visit一次且仅一次。
Postordertraverse(&
S,e)
后序遍历S,对每个结点调用函数visit一次且仅一次。
}ADTBinarytree
五、详细设计
扩展先序遍历:
#include<
stdio.h>
stdlib.h>
#include<
string.h>
typedefstructbinarytree
{
chardata;
structbinarytree*lchild,*rchild;
}BiTreeNode,*BiTree;
voidCreateBiTree(BiTree*bt)
{charch;
ch=getchar();
if(ch=='
.'
)*bt=NULL;
else
*bt=(BiTreeNode*)malloc(sizeof(BiTreeNode));
(*bt)->
data=ch;
CreateBiTree(&
((*bt)->
lchild));
rchild));
}
voidPreOder(BiTreeroot)
{if(root!
=NULL)
{printf("
%4c"
root->
data);
PreOder(root->
lchild);
rchild);
main()
BiTreeroot;
root);
printf("
先序遍历:
\n"
);
PreOder(root);
递归算法:
#include"
stdio.h"
#definePRprintf
#defineERROR0
#defineMAX100
/*============================建立各结构体===============================*/
typedefstructnode
/*数据域*/
structnode*lchild;
structnode*rchild;
/*结点的左右指针,分别指向结点的左右孩子*/
}BTNode;
typedefBTNode*DataType;
typedefstruct
DataTypedata[MAX];
inttop;
}SeqStack;
SeqStack*s;
/*============================栈的操作===================================*/
SeqStack*createemptystacks()/*创建一个空栈*/
s=(SeqStack*)malloc(sizeof(SeqStack));
s->
top=0;
returns;
intstackemptys(SeqStack*s)/*判栈空*/
returns->
top==0;
intstackfulls(SeqStack*s)/*判栈满*/
top==MAX;
voidpushs(SeqStack*s,DataTypex)/*进栈*/
if(stackfulls(s))
PR("
overflow\n"
data[s->
top++]=x;
voidpops(SeqStack*s)/*退栈*/
if(stackemptys(s))
underflow\n"
top--;
DataTypegettops(SeqStack*s)/*栈非空时取栈顶元素*/
top-1];
/*============================建立二叉树==================================*/
BTNode*createbintree()/*输入扩大的先序序列,建立二叉树*/
BTNode*t;
charx;
scanf("
%c"
&
x);
if(x=='
#'
)
t=NULL;
/*读入#,返回空指针*/
t=(BTNode*)malloc(sizeof(BTNode));
/*生成结点*/
t->
data=x;
lchild=createbintree();
/*构造左子树*/
rchild=createbintree();
/*构造右子树*/
return(t);
/*==============================树的遍历===================================*/
voidpreorder(BTNode*t)/*NLR先序遍历*/
if(t!
=NULL)
%c\t"
t->
/*访问结点*/
preorder(t->
/*中序遍历左子树*/
preorder(t->
/*中序遍历右子树*/
/*=========================================================================*/
voidinorder(BTNode*t)/*LNR中序遍历*/
inorder(t->
PR("
inorder(t->
voidpostorder(BTNode*t)/*LRN后序遍历*/
postorder(t->
/*后序遍历左子树*/
/*后序遍历右子树*/
/*===============================主函数=============================-=======*/
voidmain()
BTNode*t;
intn=0;
->
>
请输入二叉树各元素:
(例如abd##e##cf##g##)\n"
//例如abd##e##cf##g##
t=createbintree();
\n\n->
1.按先序遍历输出为:
preorder(t);
/*NLR先序遍历*/
\n按中序遍历输出为:
inorder(t);
/*LNR中序遍历*/
\n按后序遍历输出为:
postorder(t);
/*LRN后序遍历*/
#defineTRUE1
#defineFALSE0
#defineStack_Size50
#defineNUM20
typedefstructbinarytree/*定义一棵二叉树*/
structbinarytree*LChild,*RChild;
}BiTNode,*BiTree;
typedefstruct/*定义顺序栈S*/
BiTreedata[Stack_Size];
inttop;
voidCreateBiTree(BiTree&
bt)/*利用“扩展先序遍历〞创建二叉链表*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 算法 实现 二叉 遍历