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