1、二叉树得各种算法、txt男人得承诺就像80岁老太太得牙齿,很少有真得。您嗜烟成性得时候,只有三种人会高兴,医生ﻩ您得仇人与卖香烟得。ﻩﻩ ﻩﻩﻩ/*用函数实现如下二叉排序树算法: (1) 插入新结点 (2) 前序、中序、后序遍历二叉树 (3) 中序遍历得非递归算法 (4) 层次遍历二叉树 (5) 在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6) 交换各结点得左右子树 (7) 求二叉树得深度 (8) 叶子结点数 Input 第一行:准备建树得结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找得关键字 第四行:输入待查
2、找得关键字 第五行:输入待插入得关键字 Output 第一行:二叉树得先序遍历序列 第二行:二叉树得中序遍历序列 第三行:二叉树得后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后得二叉树得先、中、序遍历序列 第九行:插入新结点后得二叉树得中序遍历序列(非递归算法) 第十行:插入新结点后得二叉树得层次遍历序列 第十一行~第十三行:第一次交换各结点得左右子树后得先、中、后序遍历序列 第十四行~第十六行:第二次交换各结点得左右子树后得先、中、后序遍历序列 第十七行:二叉树得深度 第十八行:叶子结点数 */ #inc
3、lude ”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 typede
4、f 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—>lch
5、ild,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
6、d=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
7、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
8、) { ﻩ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
9、 //补全代码,可用多个语句 ﻩ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(
10、"\n"); ﻩInOrderTraverse(T, PrintElement); printf("\n"); ﻩPostOrderTraverse(T,PrintElement); printf("\n”); ﻩreturn OK; } //·······················非递归算法 struct SqStack { BiTree *base; // 在栈构造之前与销毁之后,base得值为NULL BiTree *top; // 栈顶指针 int stacksize; // 当前已分配得存储空间,以元素为单
11、位 }; // 顺序栈 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) {
12、 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 ERRO
13、R; 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)) ﻩ{ ﻩ
14、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; // 尾指针,若队列不空,指向队列尾元素得下一个位
15、置 }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(SqQueu
16、e &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)retu
17、rn 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
18、",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
19、 } 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
20、ﻩﻩ 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—>
21、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)
22、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






