求二叉树的层次遍历代码,求高手!!!

论坛 期权论坛 期权     
liuchuan031011   2018-4-26 13:55   2703   2
分享到 :
0 人收藏

2 个回复

倒序浏览
2#
御剑封刀  4级常客 | 2018-4-30 01:58:19 发帖IP地址来自
#include "stdio.h"typedef int Datatype#define MAXNODE 100
//二叉链表的存储typedef  struct  BiTNode { Datatype data; struct BiTNode   *lchild,*rchild;//左右孩子指针}BiTreeNode,*BiTree;
//三叉链表的存储typedef  struct  BiTNode { Datatype data; struct BiTNode   *lchild,*rchild,*parent;}BiTreeNode,*BiTree;
//算法3.1:二叉树的先序遍历递归算法void PreOrder(BiTree bt){ if(bt!=NULL){  visit(bt->data);//访问根结点  PreOrder(bt->lchild);  PreOrder(bt->rchild); }}
//算法3.2:二叉树的中序遍历递归算法void InOrder(BiTree bt){ if(bt!=NULL){  InOrder(bt->lchild);  visit(bt->data);  InOrder(bt->rchild); }}
//算法3.3:二叉树的后序遍历递归算法void InOrder(BiTree bt){ if(bt!=NULL){  InOrder(bt->lchild);  InOrder(bt->rchild);  visit(bt->data); }}
//算法3.4:二叉树的层次遍历算法void LevelOrder(BiTree bt){ BiTreeNode Queue[MAXNODE];  //定义队列 int front,rear; if(bt==NULL) return  //空二叉树,遍历结束 front=-1; rear=0; Queue[rear]=bt;  //根结点入队 while(rear!=front){  //队列不空,继续遍历;否则,遍历结束  front++; //出队  visit(Queue[front]->data);  //访问刚出队的元素  if(Queue[front]->lchild!=NULL){  //如果有左孩子,左孩子入队   rear++;   Queue[rear]=Queue[front]->lchild;  }  if(Queue[front]->rchild!=NULL){  //如果有右孩子,右孩子入队   rear++;   Queue[rear]=Queue[front]->rchild;  } }}
//算法3.5:中序遍历的非递归算法void NRInOrder(BiTree bt){ BiTree S[MAXNODE],p=bt;//定义栈 int top=-1; if(bt==NULL) return;//空二叉树,遍历结束 while(!(p==NULL&&top==0)){  while(p!=NULL){   if(toplchild;//指针指向p的左孩子结点  }  if(top==-1) return //栈空,结束   else{   p=S[--top];//弹出栈顶元素   visit(p->data);//访问结点的数据域   p=p->rchild;//指向p的右孩子结点  } }}

//算法3.6:根据先序与中序遍历结果建立二叉树void PreInOrd(char preord[],char inord[],int i,int j,int k,int h,BiTree *t)//先序序列从i到j,中序序列从k到h,建立一个二叉树放到t中{ int m; (*t)=new BTNode; (*t)->data=preord;//二叉树的根 m=k; while (i[m]!=preord)m++;//在中序序列中定位树根 /********递归调用建立左子树******/ if(m==k)(*t)->left=NULL; else PreInOrd(preord,inord,i+1,i+m-k,k,m-1,&(*t)->left); /********递归调用建立左子树******/ if(m==k)(*t)->right=NULL; else PreInOrd(preord,inord,i+1,i+m-k,k,m-1,&(*))->right);}BTree * createBT(char preord[],char inord[],int n,BTree root)//n为二叉树接点的个数,建立的二叉树放在root中{ if(nleft==NULL & bt->right==NULL) return 1; return (BitreeLeaf(bt->left)+BirLeaf(bt->right));}

//算法3.8:求二叉树深度算法int BitreeDepth (BiTree bt){ if(bt==NULL) return 0; if(bt->lchild==NULL & bt->rchild==NULL) return1; depthL=BitreeDepth(bt->lchild); depthR=BitreeDepth(bt->rchild); return 1+max(depthL,depthR);}

//算法3.12:二叉树的查找算法BiTree SearchBST(BiTree bt,KeyType key){ if(bt==NULL || key==bt->data.key) return bt; if(keydata.key) return SearchBST(bt->lchild,key); else return SearchBST(bt->rchild,key);}

//算法3.13:在二叉树中插入结点int InseartBST(BiTreeNode **bt,Datatype e){ BiTreeNode *qq=new BiTreeNode(),*pp=new BiTreeNode(); BiTreeNode **qq=&qq,*s,**p=&pp; *q=OxO; *p=OxO; if(SearchBST(*bt,e.key,p,q)==0)//待查结点是否在二叉排序树中 {  s=new BiTreeNode();  s->data=e;s->lchild=s->rchild=OxO;//待查结点  if(!(*q)) *bt=s;//二叉树的根  else if(e.keydata.key) (*q)->lchild=s;//作为左儿子插入  else(*q)->rchild=s;//作为右儿子插入  return 1; } else return 0;}

//算法3.14:在二叉排序树中删除结点int DeleteNode(BitreeNode **t,int key){ BiTreeNode *pp=new BiTreeNode(),*ff=new BiTreeNode; BiTreeNode **p=&pp,*s,*q,**f=&ff; *p=OxO;*f=OxO; int flag=0; if(SearchBST(*t,key,f,p)!=0){  flag=1;//查找成功,置删除标记,待删除结点为p  if(!((*p)->rchild)){//结点无右儿子,结点只有一个分支或为叶子结点   if((*f)->lchild==*p) (*f)->lchild=(*P)->lchild;   else (*f)->rchild=(*p)->lchild;  }  else{//结点有右儿子   if(!((*p)->lchild)){//结点无左儿子,一个分支   if((*f)->lchild==*p) (*f)->lchild=(*P)->rchild;   else (*f)->rchild=(*p)->rchild;  }  else {//结点有左二子,两个分支   q=*p;   s=(*p)->lchild;   while(s->rchild){q=s;s=s->rchild;}//在结点p的左分支上沿右指针域往下找,直到右指针域为空时为止   (*p)->data=s->data;   if(q!=*p){(q)->rchild=s->lchild;}   else(q)->lcild=s->lchild;  }  } } return flag;}
3#
ryazt  4级常客 | 2018-4-30 01:58:20 发帖IP地址来自
随便找一本数据结构的教材,里面肯定有
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP