ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:17.58KB ,
资源ID:11971944      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11971944.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构二叉树处理.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构二叉树处理.docx

1、数据结构二叉树处理/二叉树处理头文件/包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归)1,内容:完成二叉树创建,二叉树的前,中,后序遍历(递归)2.内容:完成二叉树的前,中序遍历(非递归)3.内容:完成查找二叉树的静,动态查找(非递归)#include stdlib.h#define MAXNODE 20#define ISIZE 8#define NSIZE0 7#define NSIZE1 8#define NSIZE2 15/SHOWCHAR = 1(显示字符)SHOWCHAR = 0(显示数字) #define SHOWCHAR 1/二叉树结构体struct BTNodei

2、nt data;BTNode *rchild;BTNode *lchild; ;/非递归二叉树遍堆栈struct ABTStackBTNode *ptree;ABTStack *link; ;char TreeNodeSNSIZE0 = A,B,C,D,E,F,G;char PreNodeNSIZE0 = A,B,D,E,C,F,G;char MidNodeNSIZE0 = D,B,E,A,C,G,F;intTreeNodeN0NSIZE12 = 0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7;int TreeNodeN1NSIZE12 = 0,0,4,1,2,2,6,3,1,

3、4,3,5,5,6,7,7;int TreeNode0NSIZE12 = 0,0,D,1,B,2,F,3,A,4,C,5,E,6,G,7;int TreeNode1NSIZE12 = 0,0,A,1,B,2,C,3,D,4,E,5,F,6,G,7;int TreeNode2NSIZE22 = 0,0,A,1,B,2,C,3,D,4,E,5,F,6,G,7,H,8,I,9,J,10,K,11,L,12,M,13,N,14;int InsertNodeISIZE = -10,-8,-5,-1,0,12,14,16;/char *prestr = ABDECFG;/char *midstr = DB

4、EACGF;/*二叉树创建函数dCreateBranchTree1()参数描述:int array:二叉树节点数据域数组int i:当前节点的序号int n:二叉树节点个数返回值:dCreateBranchTree1 = 新建二叉树的根节点指针备注:根节点 = array(i+j)/2;左子节点 = arrayi,array(i+j)2-1右子节点 = array(i+j)/2+1,arrayj */BTNode *dCreateBranchTree1(char array,int i,int n)BTNode *p;/*二叉树节点*/if(i=n)return(NULL);p = (BTNo

5、de *)malloc(sizeof(BTNode);p-data = arrayi;p-lchild = dCreateBranchTree1(array,2*i+1,n);p-rchild = dCreateBranchTree1(array,2*i+2,n);return(p); /*二叉树创建函数dCreateBranchTree2()参数描述:int array:二叉树节点数据域数组int i:当前节点的序号int n:二叉树节点个数返回值:dCreateBranchTree2 = 新建二叉树的根节点指针备注:根节点 = array(i+j)/2;左子节点 = arrayi,arra

6、y(i+j)2-1右子节点 = array(i+j)/2+1,arrayj*/BTNode *dCreateBranchTree2(char array,int i,int j)BTNode *p;/*二叉树节点*/if(ij)return(NULL);p = (BTNode *)malloc(sizeof(BTNode);p-data = array(i+j)/2;p-lchild = dCreateBranchTree2(array,i,(i+j)/2-1);p-rchild = dCreateBranchTree2(array,(i+j)/2+1,j);return(p);/*二叉树创建

7、函数dCreateBranchTree3()已知二叉树的前,中序遍历序列串,构造对应的二叉树:首先,在前序遍历序列中的首元素是二叉树的根节点,接着,在中序遍历序列中找到此节点,那么在此节点以前的节点必为其左孩子节点,以后的必为其右孩子节点;然后,在中序遍历序列中,根节点的左子树和右子树再分别对应子树前序遍历序列的首字符确定子树的根节点,再由中序遍历序列中根节点的位置分别确定构成它们的左子树和右子树的节点;依次类推,确定二叉树的全部节点,构造出二叉树.参数描述:char *pre:前序遍历序列char *mid:中序遍历序列int n:遍历序列中节点个数返回值:dCreateBranchTree

8、3 = 新建二叉树的根节点指针*/BTNode *dCreateBranchTree3(char *pre,char *mid,int n)BTNode *p;char *t;int left;if(ndata = *pre;for(t=mid;tlchild = dCreateBranchTree3(pre+1,t,left);p-rchild = dCreateBranchTree3(pre+1+left,t+1,n-1-left);return(p);/*二叉树创建函数CreateBranchTree()参数描述:int array:二叉树节点数据域数组int n:二叉树节点个数返回值:

9、CreateBranchTree = 新建二叉树的根节点指针*/BTNode *CreateBranchTree(int array2,int n)BTNode *head,*p;BTNode *NodeAddrMAXNODE;/节点地址临时缓冲区int i,norder,rorder;head = NULL;printf(二叉树原始数据:t);for(i=1;idata = arrayi0;p-lchild = p-rchild = NULL;norder = arrayi1;NodeAddrnorder = p;if(norder1)rorder = norder / 2;/*非根节点:挂

10、接在自己的父节点上*/if(norder % 2 = 0)NodeAddrrorder-lchild = p;ElseNodeAddrrorder-rchild = p;Elsehead = p;/*根节点*/if(SHOWCHAR)printf(%c ,p-data);elseprintf(%d ,p-data);return(head);/-递归部分-/*二叉树前序遍历函数dpre_Order_Access()参数描述:BTNode *head:二叉树的根节点指针*/void dpre_Order_Access(BTNode *head)if(head!=NULL)if(SHOWCHAR)

11、printf(%c ,head-data);elseprintf(%d ,head-data);dpre_Order_Access(head-lchild);/*递归遍历左子树*/dpre_Order_Access(head-rchild);/*递归遍历右子树*/*二叉树中序遍历函数dmid_Order_Access()参数描述:BTNode *head:二叉树的根节点指针*/void dmid_Order_Access(BTNode *head)if(head!=NULL)dmid_Order_Access(head-lchild);/*递归遍历左子树*/if(SHOWCHAR)printf

12、(%c ,head-data);elseprintf(%d ,head-data);dmid_Order_Access(head-rchild);/*递归遍历右子树*/*二叉树后序遍历函数dlast_Order_Access()参数描述:BTNode *head:二叉树的根节点指针*/void dlast_Order_Access(BTNode *head)if(head!=NULL)dlast_Order_Access(head-lchild);/*递归遍历左子树*/dlast_Order_Access(head-rchild);/*递归遍历右子树*/if(SHOWCHAR)printf(%

13、c ,head-data);elseprintf(%d ,head-data);/-递归部分-/-非递归部分-/*二叉树前序遍历函数pre_Order_Access()参数描述:BTNode *head:二叉树的根节点指针*/void pre_Order_Access(BTNode *head) BTNode *pt;ABTStack *ps,*top;pt = head;top = NULL;printf(二叉树的前序遍历结果:t);while(pt!=NULL |top!=NULL)/*二叉树未遍历完,或堆栈非空*/while(pt!=NULL)if(SHOWCHAR)printf(%c

14、,pt-data);/*访问根节点*/elseprintf(%d ,pt-data);/*访问根节点*/ps = (ABTStack *)malloc(sizeof(ABTStack);/*根节点进栈*/ps-ptree = pt;ps-link = top;top = ps;pt = pt-lchild;/*遍历节点右子树,经过的节点依次进栈*/if(top!=NULL)pt = top-ptree;/*栈顶节点出栈*/ps = top;top = top-link;free(ps);/*释放栈顶节点空间*/pt = pt-rchild;/*遍历节点右子树*/*二叉树中序遍历函数mid_Or

15、der_Access()参数描述:BTNode *head:二叉树的根节点指针*/void mid_Order_Access(BTNode *head)BTNode *pt;ABTStack *ps,*top;int counter =1;pt = head;top = NULL;printf(二叉树的中序遍历结果:t);while(pt!=NULL |top!=NULL)/*二叉树未遍历完,或堆栈非空*/while(pt!=NULL)ps = (ABTStack *)malloc(sizeof(ABTStack);/*根节点进栈*/ps-ptree = pt;ps-link = top;to

16、p = ps;pt = pt-lchild;/*遍历节点右子树,经过的节点依次进栈*/if(top!=NULL)pt = top-ptree;/*栈顶节点出栈*/ps = top;top = top-link;free(ps);/*释放栈顶节点空间*/if(SHOWCHAR)printf(%c ,pt-data);/*访问根节点*/elseprintf(%d ,pt-data);/*访问根节点*/pt = pt-rchild;/*遍历节点右子树*/*二叉树后序遍历函数last_Order_Access()参数描述:BTNode *head:二叉树的根节点指针*/void last_Order_

17、Access(BTNode *head)BTNode *pt;ABTStack *ps,*top;int counter =1;pt = head;top = NULL;printf(二叉树的后序遍历结果:t);while(pt!=NULL |top!=NULL)/*二叉树未遍历完,或堆栈非空*/while(pt!=NULL)ps = (ABTStack *)malloc(sizeof(ABTStack);/*根节点进栈*/ps-ptree = pt;ps-link = top;top = ps;pt = pt-lchild;/*遍历节点右子树,经过的节点依次进栈*/if(top!=NULL)

18、pt = top-ptree;/*栈顶节点出栈*/ps = top;top = top-link;free(ps);/*释放栈顶节点空间*/printf(%c ,pt-data);/*访问根节点*/pt = pt-rchild;/*遍历节点右子树*/*二叉查找树静态查找函数static_Search_STree()参数描述:BTNode *head:二叉查找树的根节点指针int key:查找关键码返回值:static_Search_STree = 键值为key的节点指针(找到)static_Search_STree = NULL(没有找到)*/BTNode *static_Search_STr

19、ee(BTNode *head,int key)while(head!=NULL)if(head-data = key)printf(数据域=%dt地址=%dt,head-data,head);return(head);/*找到*/if(head-data key)head = head-lchild;/*继续沿左子树搜索*/elsehead = head-rchild;/*继续沿右子树搜索*/return(NULL);/*没有查找*/*二叉查找树动态查找函数dynamic_Search_STree()参数描述:BTNode *head:二叉查找树的根节点指针BTNode *parent:键值

20、为key的节点的父节点指针的指针BTNode *head:键值为key的节点指针的指针(找到)或NULL(没有找到)int key:查找关键码注意:*parent = NULL 且 *p = NULL没有找到(二叉树为空)*parent = NULL 且 *p != NULL找到(找到根节点)*parent != NULL 且 *p = NULL没有找到(叶节点)*parent != NULL 且 *p != NULL找到(中间层节点)*/void dynamic_Search_STree(BTNode *head,BTNode *parent,BTNode *p,int key)*paren

21、t = NULL;*p = head;while(*p!=NULL)if(*p)-data = key)return;/*找到*/*parent = *p;/*以当前节点为父,继续查找*/if(*p)-data key)*p = (*p)-lchild;/*继续沿左子树搜索*/Else*p = (*p)-rchild;/*继续沿右子树搜索*/*二叉查找树插入节点函数Insert_Node_STree()参数描述:BTNode *head:二叉查找树的根节点指针int key:查找关键码返回值:Insert_Node_STree = 1插入成功Insert_Node_STree = 0插入失败(

22、节点已经存在)*/int Insert_Node_STree(BTNode *head,int key)BTNode *p,*q,*nnode;dynamic_Search_STree(head,&p,&q,key);if(q!=NULL)return(0);/*节点在树中已经存在*/nnode = (BTNode *)malloc(sizeof(BTNode);/*新建节点*/nnode-data = key;nnode-lchild = nnode-rchild = NULL;if(p=NULL)head = p;/*原树为空,新建节点为查找树*/elseif(p-data key)p-l

23、child = nnode;/*作为左孩子节点*/elsep-rchild = nnode;/*作为右孩子节点*/return(1);/*插入成功*/*二叉查找树插入一批节点函数Insert_Batch_Node_STree()参数描述:BTNode *head:二叉查找树的根节点指针int array:被插入的数据域数组int n:被插入的节点数目*/void Insert_Batch_Node_STree(BTNode *head,int array,int n)int i;for(i=0;in;i+)if(!Insert_Node_STree(head,arrayi)printf(插入失败!,arrayi);/-非递归部分-

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

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