二叉树用二叉链表结构进行存储,请编写算法求二叉树根结点左右子树相

米小艺 2019-12-21 18:43:00

推荐回答

使用递归进行,设这个函数为Fx1.当X为NULL,FxreturnNULL2.当X!=NULL,Fx:申请一个新节点t,然后用Fx分别处理他的左右孩子,处理后的结果用t1,t2返回,即t1=Ft->Rchild,t2=t->Lchild,再交换处理过后的左右孩子,即t->Lchild=t1,t->Rchild=t2.然后返回t。btree*swapbtreebt{btree*t,*t1,*t2;//定义指针ifbt==NULLreturnNULL;//1.如果代入的节点是个空节点,就返回空else//2.如果代入的节点不是空节点,就做下面的操作{t=btree*mallocsizeofbtree;t->data=bt->data;//申请一个新节点来存放交换后的树t1=swapt->Lchild;//处理这个节点的左子树和右子树t2=swapt->Rchild;t->Lchild=t2;//交换处理后的左右树t->Rchild=t1;returnt;//用t返回处理的结果}}这是个递归过程,可以把它理解成一个函数,这个函数代入的值不同时,返回的结果也不同。
齐文灿2019-12-21 19:58:36

提示您:回答为网友贡献,仅供参考。

其他回答

  • ,int&count{//递归方法,ifT{if!T->lchild&&!T->rchildcount++;CountLeafT->lchild,count;//统计左子树中叶子结点个数CountLeafT->rchild,count;//统计右子树中叶子结点个数}}----------非递归,就是采用前序/中序/后序遍历所有节点,并统计。下面就给你提供分别用三个函数的统计方法PS:因为计数器定义为全局,所以三个函数不能同时使用,使用其中一个就能统计你要的节点数。include"stdlib.h"#defineMAXNODE20#defineISIZE8#defineNSIZE07#defineNSIZE18#defineNSIZE215//SHOWCHAR=1显示字符SHOWCHAR=0显示数字#defineSHOWCHAR1//二叉树结构体structBTNode{intdata;BTNode*rchild;BTNode*lchild;};//非递归遍堆栈structABTStack{BTNode*ptree;ABTStack*link;};staticpCounter=0;//计数器,记录节点个数/*前序遍历函数pre_Order_Access参数描述:BTNode*head:根节点指针*/voidpre_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;pt=head;top=NULL;printf"二叉树的前序遍历结果: ";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ifSHOWCHARprintf"%c",pt->data;/*访问根节点*/elseprintf"%d",pt->data;/*访问根节点*/ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/pt=pt->rchild;/*遍历节点右子树*/}}}/*中序遍历函数mid_Order_Access参数描述:BTNode*head:根节点指针*/voidmid_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;intcounter=1;pt=head;top=NULL;printf"二叉树的中序遍历结果: ";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/ifSHOWCHARprintf"%c",pt->data;/*访问根节点*/elseprintf"%d",pt->data;/*访问根节点*/pt=pt->rchild;/*遍历节点右子树*/}}}/*后序遍历函数last_Order_Access参数描述:BTNode*head:根节点指针*/voidlast_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;intcounter=1;pt=head;top=NULL;printf"二叉树的后序遍历结果: ";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/printf"%c",pt->data;/*访问根节点*/pt=pt->rchild;/*遍历节点右子树*/}}。
    齐春泽2019-12-21 19:39:52
  • StatusPostOrderTraverseBiTreeT{//后序遍历二叉链表树的非递归算法//找到结点最大值SqStackS;InitStackS;BiTreep=T;BiTreepre=NULL;//pre指向上次访问的结点TElemTypeMaxdata=T->data;//用来储存最大值whilep||!StackEmptyS{whilep{PushS,p;p=p->lchild;}GetTopS,p;ifp->rchild==NULL||pre==p->rchild{ifp->data>MaxdataMaxdata=p->data;//更新最大值PopS,pre;p=NULL;//避免下次重新进入p的左子树}elsep=p->rchild;//走向p的右子树}returnOK;。
    连业钦2019-12-21 19:15:42
  • 文件main.cpp代码如下:#include//malloc等#include//标准输入输出头文件,包括EOF=^Z或F6,NULL等#include//atoi,exit#include//数学函数头文件,包括floor,ceil,abs等#defineClearBiTreeDestroyBiTree//清空二叉树和销毁二叉树的操作一样typedefstructBiTNode{intdata;//结点的值BiTNode*lchild,*rchild;//左右孩子指针}BiTNode,*BiTree;intNil=0;//设整型以0为空voidvisitinte{printf"%d",e;//以整型格式输出}voidInitBiTreeBiTree&T{//操作结果:构造空二叉树TT=NULL;}voidCreateBiTreeBiTree&T{//算法6.4:按先序次序输入二叉树中结点的值可为字符型或整型,在主程中定义,//构造二叉链表表示的二叉树T。变量Nil表示空子树。修改intnumber;scanf"%d",&number;//输入结点的值ifnumber==Nil//结点的值为空T=NULL;else//结点的值不为空{T=BiTreemallocsizeofBiTNode;//生成根结点if!TexitOVERFLOW;T->data=number;//将值赋给T所指结点CreateBiTreeT->lchild;//递归构造左子树CreateBiTreeT->rchild;//递归构造右子树}}voidDestroyBiTreeBiTree&T{//初始条件:二叉树T存在。操作结果:销毁二叉树TifT//非空树{DestroyBiTreeT->lchild;//递归销毁左子树,如无左子树,则不执行任何操作DestroyBiTreeT->rchild;//递归销毁右子树,如无右子树,则不执行任何操作freeT;//释放根结点T=NULL;//空指针赋0}}voidPreOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1//操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT//T不空{VisitT->data;//先访问根结点PreOrderTraverseT->lchild,Visit;//再先序遍历左子树PreOrderTraverseT->rchild,Visit;//最后先序遍历右子树}}voidInOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT{InOrderTraverseT->lchild,Visit;//先中序遍历左子树VisitT->data;//再访问根结点InOrderTraverseT->rchild,Visit;//最后中序遍历右子树}}voidPostOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT//T不空{PostOrderTraverseT->lchild,Visit;//先后序遍历左子树PostOrderTraverseT->rchild,Visit;//再后序遍历右子树VisitT->data;//最后访问根结点}}voidmain{BiTreeT;InitBiTreeT;//初始化二叉树Tprintf"按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1200300";CreateBiTreeT;//建立二叉树Tprintf"先序递归遍历二叉树:";PreOrderTraverseT,visit;//先序递归遍历二叉树Tprintf"中序递归遍历二叉树:";InOrderTraverseT,visit;//中序递归遍历二叉树Tprintf"后序递归遍历二叉树:";PostOrderTraverseT,visit;//后序递归遍历二叉树T。
    赵高奎2019-12-21 18:58:51

相关问答

,int&count{//递归方法,ifT{if!T->lchild&&!T->rchildcount++;CountLeafT->lchild,count;//统计左子树中叶子结点个数CountLeafT->rchild,count;//统计右子树中叶子结点个数}}----------非递归,就是采用前序/中序/后序遍历所有节点,并统计。下面就给你提供分别用三个函数的统计方法PS:因为计数器定义为全局,所以三个函数不能同时使用,使用其中一个就能统计你要的节点数。include"stdlib.h"#defineMAXNODE20#defineISIZE8#defineNSIZE07#defineNSIZE18#defineNSIZE215//SHOWCHAR=1显示字符SHOWCHAR=0显示数字#defineSHOWCHAR1//二叉树结构体structBTNode{intdata;BTNode*rchild;BTNode*lchild;};//非递归遍堆栈structABTStack{BTNode*ptree;ABTStack*link;};staticpCounter=0;//计数器,记录节点个数/*前序遍历函数pre_Order_Access参数描述:BTNode*head:根节点指针*/voidpre_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;pt=head;top=NULL;printf"\n二叉树的前序遍历结果:\t";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ifSHOWCHARprintf"%c",pt->data;/*访问根节点*/elseprintf"%d",pt->data;/*访问根节点*/ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/pt=pt->rchild;/*遍历节点右子树*/}}}/*中序遍历函数mid_Order_Access参数描述:BTNode*head:根节点指针*/voidmid_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;intcounter=1;pt=head;top=NULL;printf"\n二叉树的中序遍历结果:\t";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/ifSHOWCHARprintf"%c",pt->data;/*访问根节点*/elseprintf"%d",pt->data;/*访问根节点*/pt=pt->rchild;/*遍历节点右子树*/}}}/*后序遍历函数last_Order_Access参数描述:BTNode*head:根节点指针*/voidlast_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;intcounter=1;pt=head;top=NULL;printf"\n二叉树的后序遍历结果:\t";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/printf"%c",pt->data;/*访问根节点*/pt=pt->rchild;/*遍历节点右子树*/}}。