收藏 分销(赏)

二叉树的各种算法.doc

上传人:快乐****生活 文档编号:4384487 上传时间:2024-09-18 格式:DOC 页数:8 大小:28KB 下载积分:6 金币
下载 相关 举报
二叉树的各种算法.doc_第1页
第1页 / 共8页
二叉树的各种算法.doc_第2页
第2页 / 共8页


点击查看更多>>
资源描述
二叉树得各种算法、txt男人得承诺就像80岁老太太得牙齿,很少有真得。您嗜烟成性得时候,只有三种人会高兴,医生ﻩ您得仇人与卖香烟得。ﻩﻩ ﻩﻩﻩ/*用函数实现如下二叉排序树算法:  (1) 插入新结点  (2) 前序、中序、后序遍历二叉树 (3) 中序遍历得非递归算法 (4) 层次遍历二叉树  (5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6) 交换各结点得左右子树  (7) 求二叉树得深度 (8) 叶子结点数 Input 第一行:准备建树得结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找得关键字 第四行:输入待查找得关键字 第五行:输入待插入得关键字 Output 第一行:二叉树得先序遍历序列 第二行:二叉树得中序遍历序列  第三行:二叉树得后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后得二叉树得先、中、序遍历序列 第九行:插入新结点后得二叉树得中序遍历序列(非递归算法)  第十行:插入新结点后得二叉树得层次遍历序列  第十一行~第十三行:第一次交换各结点得左右子树后得先、中、后序遍历序列  第十四行~第十六行:第二次交换各结点得左右子树后得先、中、后序遍历序列 第十七行:二叉树得深度 第十八行:叶子结点数 */ #include ”stdio、h” #include "malloc、h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR  0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int  Status; typedef int KeyType; #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 #define MAXQSIZE 100 typedef int ElemType; typedef struct BiTNode{   ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针 } BiTNode,*BiTree; Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) { if(!T){p=f;return FALSE;} else if(key==T->data){p=T;return TRUE;} else if(key〈T—>data)return SearchBST(T—>lchild,key,T,p); else return(SearchBST(T—〉rchild,key,T,p)); } Status InsertBST(BiTree &T,ElemType e) { BiTree s,p;    if(!SearchBST(T,e,NULL,p)) { s=(BiTree)malloc(sizeof(BiTNode)); ﻩs—>data=e;s->lchild=s->rchild=NULL; if(!p)T=s; else if(e<p->data)p-〉lchild=s; else p—〉rchild=s; ﻩ return TRUE; ﻩ}  else return FALSE; } Status PrintElement( ElemType e ) { // 输出元素e得值 printf("%d ”, e ); return OK; }// PrintElement Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {   // 前序遍历二叉树T得递归算法,对每个数据元素调用函数Visit。   //补全代码,可用多个语句     if(T) ﻩ{ ﻩ if(Visit(T—〉data)) ﻩ if(PreOrderTraverse(T->lchild,Visit)) if(PreOrderTraverse(T—〉rchild,Visit))return OK; ﻩﻩﻩreturn ERROR; ﻩ} ﻩelse return OK; } // PreOrderTraverse Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {    // 中序遍历二叉树T得递归算法,对每个数据元素调用函数Visit. //补全代码,可用多个语句 ﻩif(T) { ﻩif(InOrderTraverse(T->lchild,Visit)) ﻩﻩ if(Visit(T-〉data)) ﻩﻩ if(InOrderTraverse(T—>rchild,Visit)) ﻩﻩﻩ return OK; ﻩ ﻩ return ERROR; }   else return OK; } // InOrderTraverse Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) {     // 后序遍历二叉树T得递归算法,对每个数据元素调用函数Visit。 //补全代码,可用多个语句 ﻩif(T) {      if(PostOrderTraverse(T->lchild,Visit)) if(PostOrderTraverse(T—>rchild,Visit)) ﻩﻩﻩif(Visit(T->data))return OK; ﻩﻩﻩreturn ERROR; ﻩ} else return OK; } // PostOrderTraverse Status Putout(BiTree T) { PreOrderTraverse(T,PrintElement); ﻩprintf("\n"); ﻩInOrderTraverse(T, PrintElement); printf("\n"); ﻩPostOrderTraverse(T,PrintElement);   printf("\n”); ﻩreturn OK; } //·······················非递归算法 struct SqStack {   BiTree *base; // 在栈构造之前与销毁之后,base得值为NULL  BiTree *top; // 栈顶指针    int stacksize; // 当前已分配得存储空间,以元素为单位 }; // 顺序栈 Status InitStack(SqStack &S)   {    S、base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree)); if(!S、base)return ERROR;    S、top=S、base;   S、stacksize=STACK_INIT_SIZE; return OK; } Status Push(SqStack &S,BiTree e) { if((S、top-S、base)〉=S、stacksize)   {   S、base=(BiTree*)realloc(S、base,(S、stacksize+STACKINCREMENT)*sizeof(BiTree)); if(!S、base)return ERROR;  S、top=S、base+S、stacksize;       S、stacksize+=STACKINCREMENT; }   *S、top++=e; return OK; } Status Pop(SqStack &S,BiTree &e) {   if(S、top==S、base)return ERROR; e=*—-S、top; return OK;ﻩ } Status StackEmpty(SqStack S) { // 若栈S为空栈,则返回TRUE,否则返回FALSE if(S、top-S、base==0)return TRUE; else return FALSE;  } Status InOrderTraverse1(BiTree T,Status(*Visit)(ElemType e),SqStack S) { BiTree p; InitStack(S);p=T; while(p||!StackEmpty(S)) ﻩ{ ﻩ if(p){Push(S,p);p=p—〉lchild;} ﻩ else ﻩ { ﻩ ﻩPop(S,p); ﻩif(!Visit(p—>data))return ERROR; ﻩp=p-〉rchild; ﻩﻩ} ﻩ} ﻩreturn OK; } //···························层次遍历 typedef struct { BiTree *base; // 初始化得动态分配存储空间 int front; // 头指针,若队列不空,指向队列头元素   int rear; // 尾指针,若队列不空,指向队列尾元素得下一个位置 }SqQueue; Status InitQueue(SqQueue &Q) {   Q、base=(BiTree*)malloc(MAXQSIZE*sizeof(BiTree));   if(!Q、base)return ERROR;    Q、front=Q、rear=0; return OK; } int QueueLength(SqQueue Q) { // 返回Q得元素个数 // 请补全代码    return(Q、rear-Q、front+MAXQSIZE)%MAXQSIZE;ﻩ } Status EnQueue(SqQueue &Q,BiTree e) {  // 插入元素e为Q得新得队尾元素 // 请补全代码 if((Q、rear+1)%MAXQSIZE==Q、front)return ERROR; Q、base[Q、rear]=e;  Q、rear=(Q、rear+1)%MAXQSIZE;    return OK; } Status DeQueue(SqQueue &Q,BiTree &e) { // 若队列不空, 则删除Q得队头元素, 用e返回其值, 并返回OK; 否则返回ERROR // 请补全代码   if(Q、front==Q、rear)return ERROR;   e=Q、base[Q、front];  Q、front=(Q、front+1)%MAXQSIZE; return OK; } Status LevelTraverse(BiTree T,SqQueue Q)//层次遍历二叉树 { ﻩInitQueue(Q); ﻩBiTree p; p=T; if(T)EnQueue(Q,T); // printf("%d”,QueueLength(Q)); while(QueueLength(Q)!=0) { ﻩDeQueue(Q,p); //根结点出队 printf("%d ",p->data); //输出数据 if(p-〉lchild)EnQueue(Q,p->lchild);  //左孩子进队 ﻩﻩif(p—〉rchild)EnQueue(Q,p->rchild);  //右孩子进队 ﻩ} ﻩreturn OK; } void Change(BiTree T) { ﻩBiTNode *p; if(T) ﻩ{p=T-〉lchild; ﻩT->lchild=T-〉rchild; T->rchild=p; ﻩChange(T—>lchild); ﻩChange(T—〉rchild); }   // return OK; } int BTreeDepth(BiTree T) //求由BT指针指向得一棵二叉树得深度 { //ﻩint dep1,dep2; if(T!=NULL) { //计算左子树得深度       int dep1=BTreeDepth(T->lchild);  //计算右子树得深度        int dep2=BTreeDepth(T-〉rchild);    //返回树得深度      if(dep1>dep2) return dep1+1;  else ﻩﻩ return dep2+1; ﻩ} else return 0; }   //`````````````叶子结点数 Status yezhi(BiTree T,SqQueue Q) { int i=0; InitQueue(Q); BiTree p; p=T; if(T)EnQueue(Q,T); //ﻩprintf(”%d",QueueLength(Q)); ﻩwhile(QueueLength(Q)!=0) { ﻩDeQueue(Q,p); ﻩﻩif(p—〉lchild)EnQueue(Q,p—〉lchild); ﻩﻩif(p—>rchild)EnQueue(Q,p-〉rchild); ﻩﻩif(!p->lchild&&!p-〉rchild) i++;   } return i; } int main() //主函数 {   SqStack S; SqQueue Q,Q3; BiTree T=NULL,f,p; ﻩint i,n,e,a,b,c; ﻩscanf("%d”,&n); ﻩfor(i=0;i〈n;i++) { ﻩﻩscanf(”%d",&e);     InsertBST(T,e); ﻩ} scanf("%d",&a);scanf(”%d”,&b);scanf("%d",&c);Putout(T); ﻩprintf("%d\n",SearchBST(T,a,f,p)); printf(”%d\n",SearchBST(T,b,f,p)); ﻩInsertBST(T,c); Putout(T); ﻩInOrderTraverse1(T, PrintElement,S);   printf("\n"); ﻩLevelTraverse(T,Q); printf(”\n”);   Change(T); Putout(T); ﻩChange(T); ﻩPutout(T); printf(”%d",BTreeDepth(T)); ﻩprintf("\n"); printf(”%d",yezhi(T,Q3)); printf("\n”); return OK; }//main
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服