2024年9月二叉树遍历代码(自学到二叉树的时候,有一段关于遍历二叉树的代码看不懂..)

 更新时间:2024-09-21 06:57:20

  ⑴二叉树遍历代码(自学到二叉树的时候,有一段关于遍历二叉树的代码看不懂..

  ⑵自学到二叉树的时候,有一段关于遍历二叉树的代码看不懂..

  ⑶这是中序遍历二叉树。

  ⑷按左子结点,父结点,右子结点顺序输出。

  ⑸第一个部分if(pNode-》pLeft

  ⑹这个意思是说,如果头结点的左子不为空,也就是说如果父结点有左子结点的话。

  ⑺进入递归。函数的实参是父结点的左子结点。

  ⑻再看这个结点有没有左子结点。如果有,继续递归,实参是这个结点的左子结点。

  ⑼一直到某个结点的左子为空了,也就是没有左子了,这个时候当前执行的函数就进入下一个部分了。

  ⑽下一个部分是输出这个结点的数据。

  ⑾然后就是最后一个部分,递归父节点的右子。(如果有右子的话

  ⑿不过还是得先看当前结点有没有左子,如果有,递归,如果没有,输出结点数据。然后判断右子。

  ⒀看图,输出的是应该是cbdafeg。

  ⒁第一次①a结点,进入函数判断有没有左子,有,递归到b,②判断有没有左子,有,递归到c,③判断有没有左子,没有,输出c。判断有没有右子,没有。这个函数结束。返回到调用它的函数②里,这时候第一部分已经执行完毕(即使③,执行输出b,然后判断有没有右子,有,递归到d。④判断有没有左子,没有,输出d,判断有没有右子,没有,返回函数②,这时候函数②三个部分执行完毕,返回到函数①,这时候函数①也只是执行完第一部分,然后输出a。然后判断有没有右子,有。然后不就不往下说了。

  ⒂二叉树的遍历的完整代码是什么

  ⒃二叉树遍历代码#include“iostream.h“#include“stdlib.h“#include“stdio.h“#include《stack》usingnamespacestd;#defineNULL#defineOK#defineOVERFLOW-typedefintStatus;typedefstructnode{chardata;structnode*lchild;structnode*rchild;}*bitree;intk=;intdepth(bitreeT)//树的高度{if(!T)return;else{intm=depth(T-》lchild);intn=depth(T-》rchild);return(m》n?m:n)+;}}//先序,中序建树structnode*create(char*pre,char*ord,intn){structnode*T;intm;T=NULL;if(n《=){returnNULL;}else{m=;T=new(structnode);T-》data=*pre;T-》lchild=T-》rchild=NULL;while(ord[m]!=*pre)m++;T-》lchild=create(pre+,ord,m);T-》rchild=create(pre+m+,ord+m+,n-m-);returnT;}}//中序递归遍历voidinorder(structnode*T){if(!T)return;else{inorder(T-》lchild);cout《《T-》data;inorder(T-》rchild);}}voidinpre(structnode*T){if(!T)return;else{cout《《T-》data;inpre(T-》lchild);inpre(T-》rchild);}}voidpostorder(structnode*T){if(!T)return;else{postorder(T-》lchild);postorder(T-》rchild);cout《《T-》data;}}//先序非递归遍历voidinpre(structnode*T)第/页{structnode*p;structnode*stack;inttop=;p=T;cout《《“非递归先序为:“《《endl;while(p||top!=){while(p){stack[top++]=p;cout《《p-》data;p=p-》lchild;}p=stack[--top];p=p-》rchild;}}//中序非递归遍历voidinorder(structnode*T){structnode*p;structnode*stack;inttop=;p=T;cout《《“非递归中序为:“《《endl;while(p||top!=){while(p){stack[top++]=p;p=p-》lchild;}p=stack[--top];cout《《p-》data;p=p-》rchild;}}//主函数intmain(){bitreeT;charpre,ord;第/页intn,m;cout《《“请输入先序为-+a*b%cd/ef的二叉树:“《《endl;gets(pre);cout《《“请输入中序为a+b*c%d-e/f的二叉树:“《《endl;gets(ord);n=strlen(pre);T=create(pre,ord,n);cout《《“后序遍历为:“《《endl;postorder(T);cout《《endl;inpre(T);cout《《endl;inorder(T);cout《《endl;m=depth(T);cout《《“二叉树高度为:“《《m《《endl;return;}

  ⒄如何实现二叉树的遍历

  ⒅二叉树的遍历在遍历二叉树的过程中,一般先遍历左子树,再遍历右子树。(前序遍历先访问根结点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍需先访问根结点,然后遍历左子树,最后遍历右子树。(中序遍历先遍历左子树、然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。(后序遍历先遍历左子树、然后遍历右子树,最后访问根结点;并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。

  ⒆关于二叉树的递归与非递归遍历代码(主要是非递归后序

  ⒇二叉树的遍历是指按照一定次序访问二叉树中的所有节点,且每个节点仅被访问一次的过程。是最基本的运算,是其他运算的基础。二叉树有两种存储结构:顺序存储和链式存储顺序存储:(对完全二叉树来说,可以充分利用存储空间,但对于一般的二叉树,只有少数的存储单元被利用[cpp]viewplaincopytypedefstruct{ElemTypedata[MaxSize];intn;}SqBTree;链式存储:[csharp]viewplaincopytypedefstructnode{ElemTypedata;structnode*lchild;structnode*rchild;}BTNode;二叉树三种递归的遍历方法:先序遍历访问根节点→先序遍历左子树→先序遍历右子树中序遍历中序遍历左子树→访问根节点→中序遍历右子树后序遍历后序遍历左子树→后序遍历右子树→访问根节点二叉树遍历的递归算法:[cpp]viewplaincopyvoidpreOrder(BTNode*b)//先序遍历递归算法{if(b!=NULL){visit(b);preOrder(b-》lchild);preOrder(b-》rchild);}}voidInOrder(BTNode*b)//中序遍历递归算法{if(b!=NULL){InOrder(b-》lchild);visit(b);InOrder(b-》rchild);}}voidPostOrder(BTNode*b)//后序遍历递归算法{if(b!=NULL){PostOrder(b-》lchild);PostOrder(b-》rchild);visit(b);}}二叉树非递归遍历算法:有两种方法:①用栈存储信息的方法②增加指向父节点的指针的方法暂时只介绍下栈的方法先序遍历:[cpp]viewplaincopyvoidPreOrder(BTNode*b){Stacks;while(b!=NULL||!s.empty()){if(b!=NULL){visit(b);s.push(b);b=b-》left;}else{b=s.pop();b=b-》right;}}}中序遍历:[cpp]viewplaincopyvoidInOrder(BTNode*b){Stacks;while(b!=NULL||!s.empty()){if(b!=NULL){s.push(b);s=s-》left}if(!s.empty()){b=s.pop();visit(b);b=b-》right;}}}后序遍历:[cpp]viewplaincopyvoidPostOrder(BTNode*b){Stacks;while(b!=NULL){s.push(b);}while(!s.empty()){BTNode*node=s.pop();if(node-》bPushed){visit(node);}else{s.push(node);if(node-》right!=NULL){node-》right-》bPushed=false;s.push(node-》right);}if(node-》left!=NULL){node-》left-》bpushed=false;s.push(node-》left);}node-》bPushed=true;//如果标识位为true,则表示入栈}}}层次遍历算法:(用队列的方法[cpp]viewplaincopyvoidlevelOrder(BTNode*b){QueueQ;Q.push(b);while(!Q.empty()){node=Q.front();visit(node);if(NULL!=node-》left){Q.push(node-》left);}if(NULL!=right){Q.push(node-》right);}}}已知先序和中序求后序的算法:(已知后序和中序求先序的算法类似,但已知先序和后序无法求出中序[cpp]viewplaincopyintfind(charc,charA,ints,inte)/*找出中序中根的位置。*/{inti;for(i=s;iin_e)return;/*非法子树,完成。*/if(in_s==in_e){printf(“%c“,in[in_s]);/*子树子仅为一个节点时直接输出并完成。*/return;}c=pre[pre_s];/*c储存根节点。*/k=find(c,in,in_s,in_e);/*在中序中找出根节点的位置。*/pronum(pre,pre_s+,pre_s+k-in_s,in,in_s,k-);/*递归求解分割的左子树。*/pronum(pre,pre_s+k-in_s+,pre_e,in,k+,in_e);/*递归求解分割的右子树。*/printf(“%c“,c);/*根节点输出。*/}main(){charpre=“abdc“;charin=“bdac“;printf(“Theresult:“);pronum(pre,,strlen(in)-,in,,strlen(pre)-);getch();}

  ⒈编程实现以上二叉树中序遍历操作,输出遍历序列,求写代码~~

  ⒉#include《stdio.h》#include《stdlib.h》#include《malloc.h》

  ⒊#defineOK?#defineERROR?#defineOVERFLOW?

  ⒋typedefcharTElemType;typedefintStatus;typedefstructBiTNode{?TElemTypedata;?structBiTNode*lchild,*rchild;}BiTNode,*BiTree;typedefenum{Link,Thread}PointerTag;typedefstructBiThrNode{?TElemTypedata;?structBiThrNode*lchild,*rchild;?PointerTagLTag,RTag;}BiThrNode;typedefBiThrNode*BiThrTree;

  ⒌BiTreeCreateBiTree(BiTreeT)???//先序遍历构造二叉树{?charch;?scanf(“%c“,&ch);?if(ch==’#’)???//#代表空指针??T=NULL;?else?{??T=(BiTNode*)malloc(sizeof(BiTNode));???//申请结点??if(!T)???exit(OVERFLOW);??T-》data=ch;???//生成根结点??T-》lchild=CreateBiTree(T-》lchild);???//构造左子树??T-》rchild=CreateBiTree(T-》rchild);???//构造右子树?}?returnT;}

  ⒍StatusInOrderTraverse(BiTreeT,Status(*visit)(TElemType)){//中序遍历二叉树?if(T)?{??if(InOrderTraverse(T-》lchild,visit))???if(visit(T-》data))????if(InOrderTraverse(T-》rchild,visit))?????returnOK;??returnERROR;?}?else??returnOK;}

  ⒎StatusPrintElement(TElemTypee){?printf(“%-c“,e);?returnOK;}

  ⒏voidmain(){?BiTreeT=NULL;?printf(“请输入构造二叉树的字符序列:“);?T=CreateBiTree(T);?if(T)??printf(“二叉树建立成功!

  ⒐“);?else??printf(“二叉树构造失败!!!

  ⒑“);?printf(“中序遍历二叉树:“);?InOrderTraverse(T,PrintElement);?printf(“

  ⒒用c++来实现二叉树的遍历

  ⒓内容比较多,好好看看单链表实现二叉树结构综合案例(使用类模板的方法--------------------二叉树节点类#ifndef?TREE_NODE#define?TREE_NODE#include?《iostream》using?namespace?std;template《typename?T》class?Tree_Node{friend?ostream&?operator《《?《T》(ostream&?out,const?Tree_Node&?TN);//特例?这里不是:Tree_Node《T》&……模板参数移到前面去了public:????Tree_Node();????Tree_Node《T》*?searchNode(int?_index);?//判断当前节点,当前节点的孩子节点是否是要寻找的节点????void?DeleteNode();????void?Preorder();????void?Inorder();????void?Postorder();????int?m_iIndex;?//节点的唯一索引值?????T???m_TData;??//节点的数据类型在运行的时候指定?//凡是要用到当前类的声明对象的都要加上模板参数????Tree_Node《T》*?m_pLchild;?//左孩子指针????Tree_Node《T》*?m_pRchild;?//右孩子指针????Tree_Node《T》*?m_pParent;?//父指针};template《typename?T》ostream&?operator《《(ostream&?out,const?Tree_Node《T》&?TN)?//模板参数又移到形参变量的地方了{????out《《TN.m_iIndex《《“:“《《TN.m_TData《《endl;????return?out;}template《typename?T》Tree_Node《T》::Tree_Node()?//实现构造函数,模板参数在类名中已经体现出来了{????this-》m_iIndex?=;????this-》m_TData?=NULL;????this-》m_pLchild?=NULL;????this-》m_pRchild?=NULL;????this-》m_pParent?=NULL;}template《typename?T》Tree_Node《T》*?Tree_Node《T》::searchNode(int?_index)?//根据节点的唯一索引值,查找节点,并返回节点的指针{????if?(this-》m_iIndex?==?_index)?//?这个this指的是根节点这个对象????{????????return?this;????}????Tree_Node《T》*?find_node?=NULL;??//保存左子树和右子树查找到的结果????if?(this-》m_pLchild?!=NULL)????{????????if?(this-》m_pLchild-》m_iIndex?==?_index)????????{????????????return?this-》m_pLchild;????????}????????else?//当前节点的左孩子不是目标节点,再查找左孩子的后代,并返回结果,递归实现的关键????????{????????????find_node?=?this-》m_pLchild-》searchNode(_index);????????????//如果在左子树上找到了,则返回找到的节点,如果没有找到,再去右子树查找,在右子树查找的结果不管有没有都返回????????????if?(find_node?!=?NULL)????????????{????????????????return?find_node;????????????}????????}????????????}????if?(this-》m_pRchild?!=NULL)????{????????if?(this-》m_pRchild-》m_iIndex?==?_index)????????{????????????return?this-》m_pRchild;????????}else????????{????????????find_node?=this-》m_pRchild-》searchNode(_index);????????????return?find_node;??????????}????}????return?NULL;?//?要执行到这一步,就说明该节点既没有左孩子和右孩子,本身也不是待查找节点,就返回空指针了}template《typename?T》void?Tree_Node《T》::DeleteNode()??//?删除节点,递归删除它的左孩子节点和右孩子节点{????if?(this-》m_pLchild?!=NULL)?//如果当前节点的左孩子节点不为空,则递归删除该左孩子节点和左孩子所有后代节点????{????????this-》m_pLchild-》DeleteNode();????}????if?(this-》m_pRchild?!=?NULL)//如果当前节点的右孩子节点不为空,则递归删除该子节点的所有后代????{????????this-》m_pRchild-》DeleteNode();????}????//如果当前节点的父指针不为空,把这个指向关系置空????if?(this-》m_pParent?!=?NULL)????{????????//判断当前节点是父节点的左孩子还是右孩子,以便置空父节点的左孩子指针还是右孩子指针????????if?(this-》m_pParent-》m_pLchild?==?this)????????{????????????this-》m_pParent-》m_pLchild?=NULL;?//如果当前节点是父节点的左孩子,则置空父节点的????????}????????if?(this-》m_pParent-》m_pRchild?==?this)????????{????????????this-》m_pParent-》m_pRchild?=NULL;????????}????}????delete?this;????????//这里没有显示的定义析构函数的原因是,删除节点的时候,该节点的所有指针对象都已经是空值了,没有释放内存空间的需要??????//?自身节点也就是一个数据域,使用系统默认的析构函数就能完成这一点???????//最后再删除本身这个节点,递归执行到这一步,就是叶子节点做的操作,这一层递归结束后,它的父节点就变成了叶子节点,递归很合理}template《typename?T》void?Tree_Node《T》::Preorder()??//?二叉树的前序遍历{????//前序遍历先输出本身,再输出左子树,后输出右子树,递归的使用本身????cout《《this-》m_iIndex《《“:“《《this-》m_TData《《endl;????if?(this-》m_pLchild?!=NULL)?//如果当前的左节点不为空,则递归输出左节点以及左节点的后代????{????????this-》m_pLchild-》Preorder();????}????if?(this-》m_pRchild?!=NULL)?????{????????this-》m_pRchild-》Preorder();????}}template《typename?T》void?Tree_Node《T》::Inorder()?//二叉树的中序遍历{????????//中序遍历先输出左子树,再输出根,后输出右子树????if?(this-》m_pLchild?!=NULL)?//如果当前的左节点不为空,则递归输出左节点以及左节点的后代????{????????this-》m_pLchild-》Inorder();????}????cout《《this-》m_iIndex《《“:“《《this-》m_TData《《endl;????if?(this-》m_pRchild?!=NULL)????{????????this-》m_pRchild-》Inorder();????}}template《typename?T》void?Tree_Node《T》::Postorder()?//二叉树的后序遍历{????if?(this-》m_pLchild?!=NULL)?//如果当前的左节点不为空,则递归输出左节点以及左节点的后代????{????????this-》m_pLchild-》Postorder();????}????if?(this-》m_pRchild?!=NULL)????{????????this-》m_pRchild-》Postorder();????}????cout《《this-》m_iIndex《《“:“《《this-》m_TData《《endl;?//?最后输出根节点的信息}#endif------------------------------二叉树类的实现,带有模板参数的类,声明和实现最好放在一个文件中,不容易出错#ifndef?TREE_h#define?TREE_h#include?“Tree_Node.h“template《typename?T》class?Tree{public:????Tree();????Tree_Node《T》*?searchNode(int?_index);?//从根节点递归的方法向下搜索树,知道找到节点的索引等于参数的索引值????bool?AddNode(int?_index,?int?_direction,Tree_Node《T》*?pNode);?//添加节点????bool?DeleteNode(int?_index);?//删除节点,不仅仅要删除自己,还要删除自己所有的后代节点,父节点的指向,用递归来实现????~Tree();?//析构函数????//树的前序遍历,后序遍历和中序遍历都是递归的方法,递归的调用节点中的方法,从这里就看到面向对象编程的好处了,比C语言的方法简单多了????void?Preorder();????void?Inorder();????void?Postorder();private:????Tree_Node《T》*?m_pTree;};template《typename?T》Tree《T》::Tree(){????this-》m_pTree?=?new?Tree_Node《T》();????//第一个节点为根节点,索引默认为,未指定它的孩子节点,所以孩子节点指针为空,父节点不存在,指向默认为空????//这个地方出现了错误,写代码的时候语法没有检测出来,任何地方使用带有模板参数的函数都要加上参数列表????//错误的写法:this-》m_pTree?=?new?Tree_Node();}template《typename?T》Tree_Node《T》*?Tree《T》::searchNode(int?_index){????return?this-》m_pTree-》searchNode(_index);}template《typename?T》bool?Tree《T》::AddNode(int?_index,?int?_direction,Tree_Node《T》*?pNode){????Tree_Node《T》*?direction_node?=?this-》searchNode(_index);???????????????????????????//插入节点是在指定的节点下插入,如果这个指定的节点不存在,插入操作就失败了????if?(direction_node?==NULL)????{????????return?false;????}????//不能传进来的临时节点pNode做为树中新增的结点,因为是对指针的操作,外部操作pNode会同步影响到插入树中节点的值,应该重新申请一块内存空间????Tree_Node《T》*?new_node?=new?Tree_Node《T》();????if?(NULL?==?new_node)????{????????return?false;????}????new_node-》m_iIndex?=?pNode-》m_iIndex;????new_node-》m_TData=?pNode-》m_TData;????//新增节点的父节点????new_node-》m_pParent?=?direction_node;????if?(_direction?==)?//如果插入的是左孩子,指针指向如下????{????????direction_node-》m_pLchild?=?new_node;????????//?程序这里默认,目标节点没有孩子节点,二叉树的构造是从上到下一步一步构造的???????//实际上有了删除节点的方法,即使该节点有过孩子节点,只需删除该孩子节点,也不是很麻烦????}????if?(_direction?==)?//如果是右孩子,则当前节点指向目标节点????{????????direction_node-》m_pRchild?=?new_node;????}????return?true;}template《typename?T》bool?Tree《T》::DeleteNode(int?_index)?//?删除节点,这一步应该放在{????Tree_Node《T》*?direction_node?=?this-》searchNode(_index);????if?(NULL?==?direction_node)?//如果目标节点为空,那么删除操作也就没有意义了????{????????return?false;????}????//如果不为空则调用节点对象的删除方法????direction_node-》DeleteNode();????return?true;}template《typename?T》Tree《T》::~Tree(){????//树的析构函数执行起来就很简单了,直接对根节点调用deleteNode函数就可以了????this-》m_pTree-》DeleteNode();????//?或者?DeleteNode()}template《typename?T》void?Tree《T》::Preorder(){????//前序遍历????this-》m_pTree-》Preorder();}template《typename?T》void?Tree《T》::Inorder(){????//中序遍历????this-》m_pTree-》Inorder();}template《typename?T》void?Tree《T》::Postorder(){????//后续遍历????this-》m_pTree-》Postorder();}#endif--------------------测试主文件#include?《iostream》#include?《stdlib.h》#include?“Tree.h“using?namespace?std;/*???????????()?????()????????()()???()???()????()??*/int?main(){????Tree《int》*?tree?=new?Tree《int》();????//生成一个树的,默认有一个根节点,根节点不放数据,索引默认为????Tree_Node《int》*?node?=?new?Tree_Node《int》();????node-》m_iIndex?=;????node-》m_TData??=;????Tree_Node《int》*?node?=?new?Tree_Node《int》();????node-》m_iIndex?=;????node-》m_TData??=;????//在根节点下插入和号子节点????tree-》AddNode(,,node);????tree-》AddNode(,,node);????Tree_Node《int》*?node?=?new?Tree_Node《int》();????node-》m_iIndex?=;????node-》m_TData??=;????Tree_Node《int》*?node?=?new?Tree_Node《int》();????node-》m_iIndex?=;????node-》m_TData??=;????//在号节点下插入和号子节点????tree-》AddNode(,,node);????tree-》AddNode(,,node);????Tree_Node《int》*?node?=?new?Tree_Node《int》();????node-》m_iIndex?=;????node-》m_TData??=;????Tree_Node《int》*?node?=?new?Tree_Node《int》();????node-》m_iIndex?=;????node-》m_TData??=;????//在号节点下插入和号子节点????tree-》AddNode(,,node);????tree-》AddNode(,,node);????//前序遍历:??????????tree-》Preorder();????cout《《“---------------------“《《endl;????//中序遍历:??????????tree-》Inorder();????cout《《“---------------------“《《endl;????//后序遍历:??????????tree-》Postorder();????cout《《“---------------------“《《endl;????cout《《*(tree-》searchNode())《《endl;?//返回:?模板类的输出运算符友元函数形式重载成功,特例,一定要记住,会用????cout《《“---------------------“《《endl;????//?删除操作的实现????tree-》DeleteNode();????tree-》Preorder();????system(“pause“);????return?;}

  ⒔我要二叉树代码递归遍历,非递归遍历,层次遍历

  ⒕#include《stdio.h》#include《stdlib.h》typedefchardatatype;typedefstructbitnode{datatypedata;structbitnode*lchild,*rchild;}tree;tree*init(){tree*bt;bt=NULL;bt=(tree*)malloc(sizeof(tree));bt-》lchild=NULL;bt-》rchild=NULL;returnbt;}tree*create(tree*bt){charch;scanf(“%c“,&ch);if(ch==’’){bt=NULL;returnbt;}else{bt=(tree*)malloc(sizeof(tree));bt-》data=ch;bt-》lchild=create(bt-》lchild);bt-》rchild=create(bt-》rchild);}returnbt;}tree*Linsert(datatypex,tree*parent){tree*p;if(parent==NULL){printf(“inserterror

  ⒖“);returnNULL;}if((p=(tree*)malloc(sizeof(tree)))==NULL)returnNULL;p-》data=x;p-》lchild=NULL;p-》rchild=NULL;if(parent-》lchild==NULL)parent-》lchild=p;else{p-》lchild=parent-》lchild;parent-》lchild=p;}returnparent;}tree*Rinsert(datatypex,tree*parent){tree*p;if(parent==NULL){printf(“inserterror

  ⒗“);returnNULL;}if((p=(tree*)malloc(sizeof(tree)))==NULL)returnNULL;p-》data=x;p-》lchild=NULL;p-》rchild=NULL;if(parent-》rchild==NULL)parent-》rchild=p;else{p-》rchild=parent-》rchild;parent-》rchild=p;}returnparent;}tree*Ldel(tree*parent){tree*p;if(parent==NULL||parent-》lchild==NULL){printf(“deleteerror

  ⒘“);returnNULL;}p=parent-》lchild;parent-》lchild=NULL;free(p);returnparent;}tree*Rdel(tree*parent){tree*p;if(parent==NULL||parent-》rchild==NULL){printf(“deleteerror

  ⒙“);returnNULL;}p=parent-》rchild;parent-》rchild=NULL;free(p);returnparent;}voidvisit(tree*bt){printf(“%c“,bt-》data);}voidpreorder(tree*bt){if(bt==NULL)return;visit(bt);preorder(bt-》lchild);preorder(bt-》rchild);}voidinorder(tree*bt){if(bt==NULL)return;inorder(bt-》lchild);visit(bt);inorder(bt-》rchild);}voidpostorder(tree*bt){if(bt==NULL)return;postorder(bt-》lchild);postorder(bt-》rchild);visit(bt);}tree*search(tree*bt,datatypex){tree*p;p=NULL;if(bt){if(bt-》data==x)returnbt;if(bt-》lchild)p=search(bt-》lchild,x);if(p!=NULL)returnp;if(bt-》rchild)p=search(bt-》rchild,x);if(p!=NULL)returnp;}returnp;}voidnrpreorder(tree*bt){tree*stack,*p;inttop=-;if(bt==NULL)return;p=bt;while(!(p==NULL&?==-)){while(p!=NULL){visit(p);top++;stack[top]=p;p=p-》lchild;}if(top《)return;else{p=stack[top];top--;p=p-》rchild;}}}voidnrinorder(tree*bt){tree*stack,*p;inttop=-;if(bt==NULL)return;p=bt;while(!(p==NULL&?==-)){while(p!=NULL){top++;stack[top]=p;p=p-》lchild;}if(top《)return;else{p=stack[top];top--;visit(p);p=p-》rchild;}}}voidnrpostorder(tree*bt){inttop;tree*d,*dd;tree*stack,*p;if(bt==NULL)return;top=-;p=bt;while(!(p==NULL&?==-)){while(p!=NULL){top++;stack[top]=p;p=p-》lchild;}dd=stack[top];if(top》-)if(dd){p=stack[top]-》rchild;d[top]=stack[top];stack[top]=NULL;dd=NULL;}else{p=d[top];top--;visit(p);p=NULL;}}}voidlevelorder(tree*bt){tree*queue;intfront,rear;if(bt==NULL)return;front=-;rear=;queue[rear]=bt;while(front!=rear){front++;visit(queue[front]);if(queue[front]-》lchild!=NULL){rear++;queue[rear]=queue[front]-》lchild;}if(queue[front]-》rchild!=NULL){rear++;queue[rear]=queue[front]-》rchild;}}}intcountleaf(tree*bt){if(bt==NULL)return;if(bt-》lchild==NULL&&bt-》rchild==NULL)return;return(countleaf(bt-》lchild)+countleaf(bt-》rchild));}intmain(){tree*bt,*p;intn=,m,t;charx;printf(“-----------------------程序说明---------------------------

  ⒚“);printf(“.本程序涉及二叉树的所有操作。

  ⒛“);printf(“.创建操作为先序输入,输入代表空。

  “);printf(“.删除操作和插入操作之前必须使用查找操作找到其双亲。

  “);printf(“.输入回车键开始本程序。

  “);printf(“----------------------------------------------------------

  “);getchar();while(n!=){printf(“choose:

  Createabitree、Search

  Preorder、Inorder、Postorder

  Levelorder、Thenumberofleaves

  “);printf(“Do:“);scanf(“%d“,&n);getchar();switch(n){case:bt=init();printf(“Createabitree:“);bt=create(bt);break;case:printf(“Inputachar:“);scanf(“%c“,&x);getchar();p=search(bt,x);if(p!=NULL){printf(“、donothing

  InsretL-tree、InsertR-tree

  DeleteL-tree、DeleteR-tree

  “);printf(“Do:“);scanf(“%d“,&m);getchar();switch(m){case:break;case:printf(“Inputachar:“);scanf(“%c“,&x);Linsert(x,p);break;case:printf(“Inputachar:“);scanf(“%c“,&x);Rinsert(x,p);break;case:if(Ldel(p)!=NULL)printf(“plishdelete!

  “);break;case:if(Rdel(p)!=NULL)printf(“plishdelete!

  “);break;default:printf(“Inputerror

  “);}}elseprintf(“Thechardosenotexist

  “);break;case:printf(“、Recursive、Nonrecursive

  “);printf(“Do:“);scanf(“%d“,&t);if(t==)preorder(bt);elsenrpreorder(bt);printf(“

  “);break;case:printf(“、Recursive、Nonrecursive

  “);printf(“Do:“);scanf(“%d“,&t);if(t==)inorder(bt);elsenrinorder(bt);printf(“

  “);break;case:printf(“、Recursive、Nonrecursive

  “);printf(“Do:“);scanf(“%d“,&t);if(t==)postorder(bt);elsenrpostorder(bt);printf(“

  “);break;case:levelorder(bt);break;case:printf(“%d

  “,countleaf(bt));break;case:break;default:printf(“Inputerror

  “);}printf(“

  “);}return;}

  C语言二叉树遍历代码

  t=malloc(sizeof(tree));.t-》rchild=createTree();.voidqianxu(tree*t).zhongxu(t-》lchild);//再读左子树printf(“%c“,t-》data);//先读根结点zhongxu(t-》rchild);//再读右子树.houxu(t-》lchild);//再读左子树houxu(t-》rchild);//再读右子树printf(“%c“,t-》data);//先读根结点.return;.n=count(t-》lchild)+count(t-》rchild)+;.t-》data=t-》data;.returnt;.returnm+;PS:注意有些语句结尾是没有分号的

  这个二叉树遍历代码的输入怎么结束啊求解答

  这就是按先序算法建立的二叉树,如果一个结点没有某棵子树,输入一个空格就行了。

  比如对于如图所示的二叉树:

  这是运行结果的截图:

您可能感兴趣的文章:

相关文章