资源描述
二叉树得各种算法、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
展开阅读全文