#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct BTinNode
{
ElemType data;
struct BTinNode *lchild;
struct BTinNode *rchild;
}BTinNode,*BinTree;
typedef BinTree QlemType;
typedef struct
{
QlemType num[MaxSize];
int front;
int rear;
} Queue;
Queue Q;
void initilize()
{
Q.front = 0;
Q.rear = 0;
}
int Push(BTinNode *T)
{
if((Q.rear+1)==Q.front)
return 0;
else
Q.num[++Q.rear] = T;
return 1;
}
int Empty()
{
if(Q.front==Q.rear)
return 1;
else
return 0;
}
BTinNode *Pop()
{
if(Q.front==Q.rear)
return 0;
return Q.num[++Q.front];
}
void Creat(BinTree *T)
{
ElemType ch;
scanf("%c",&ch);
if(ch == '#')
*T = NULL;
else
{
*T = (BinTree)malloc(sizeof(BTinNode));
if(!*T)
printf("失败\n");
(*T)->data = ch;
Creat(&(*T)->lchild);
Creat(&(*T)->rchild);
}
}
void PrtOrder(BinTree T)
{
if(T == NULL)
return;
if(T->lchild==NULL&&T->rchild==NULL)
{
printf("%c ",T->data);
return;
}
printf("%c ",T->data);
PrtOrder(T->lchild);
PrtOrder(T->rchild);
}
void InOrder(BinTree T)
{
if(T == NULL)
return;
if(T->lchild==NULL&&T->rchild==NULL)
{
printf("%c ",T->data);
return;
}
InOrder(T->lchild);
printf("%c ",T->data);
InOrder(T->rchild);
}
void PostOrder(BinTree T)
{
if(T == NULL)
return;
if(T->lchild==NULL&&T->rchild==NULL)
{
printf("%c ",T->data);
return;
}
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ",T->data);
}
int Deep(BinTree T)
{
int m,n;
if(T == NULL)
return 0;
else if(T->lchild==NULL&&T->rchild==NULL)
{
return 1;
}
else
{
m = Deep(T->lchild);
n = Deep(T->rchild);
if(m>n)
return (m+1);
else
return (n+1);
}
}
BTinNode *preorder_x(BTinNode *bt, char x)
{
BTinNode *t=NULL;
if (bt != NULL){
if (bt->data==x)
return bt;
t=preorder_x(bt->lchild, x);
if(t) return t;
t=preorder_x(bt->rchild, x);
if(t) return t;
}
return NULL;
}
int depth(BTinNode *bt)
{
int hl=0,hr=0;
if (bt == NULL) return 0;
else if (bt->lchild == NULL && bt->rchild == NULL) return 1;
else{
hl = depth(bt->lchild);
hr = depth(bt->rchild);
return (hl>hr?hl:hr)+1;
}
}
int NodeCount(BinTree T)
{
if(T == NULL)
return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchild) +1;
}
int LeafCount(BinTree T)
{
if(!T)
return 0;
if(!T->lchild &&!T->rchild)
{
return 1;
}
else
{
return LeafCount(T->lchild)+LeafCount(T->rchild);
}
}
int exchange(BinTree T)
{
BTinNode *temp;
if(!T)
return 0;
if(T->lchild == NULL && T->rchild == NULL)
return 0;
else
{
temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
}
if(T->lchild)
exchange(T->lchild);
if(T->rchild)
exchange(T->rchild);
return 1;
}
void LevelOrder(BinTree T)
{
BTinNode *temp;
if(!T)
return;
if(T->lchild==NULL&&T->rchild==NULL)
{
printf("%c ",T->data);
return;
}
Push(T);
while (!Empty())
{
temp = Pop();
printf("%c ", temp->data);
if(temp->lchild)
Push(temp->lchild);
if(temp->rchild)
Push(temp->rchild);
}
}
int main()
{
BTinNode *p;
int m,n,y;
char x;
BinTree T = NULL;
printf("先序遍历生成二叉树\n");
Creat(&T);
printf("--------------------二叉树的建立与应用-------------------------\n");
printf(" 1.二叉树的先序遍历\n");
printf(" 2.二叉树的中序遍历\n");
printf(" 3.二叉树的后序遍历\n");
printf(" 4.二叉树的深度\n");
printf(" 5.二叉树的结点的个数\n");
printf(" 6.二叉树叶子结点的个数\n");
printf(" 7.二叉树层次遍历\n");
printf(" 8.每个结点的左右子树交换位置\n");
printf(" 9.求二叉树以某个结点X为根的子树的深度\n");
printf(" 10.退出系统\n");
printf("----------------------------------------------------------------\n");
while(1)
{
scanf("%d",&m);
if(m==1)
{printf("先序遍历为:");
PrtOrder(T);
printf("\n");}
if(m==2)
{printf("中序遍历为:");
InOrder(T);
printf("\n");}
if(m==3)
{printf("后序遍历为:");
PostOrder(T);
printf("\n");}
if(m==4)
{n = Deep(T);
printf("树的深度:%d\n",n);}
if(m==5)
{n = NodeCount(T);
printf("树的结点数:%d\n",n);}
if(m==6)
{n = LeafCount(T);
printf("叶子结点数:%d\n",n);}
if(m==7)
{printf("层次遍历为:");
initilize();
LevelOrder(T);
printf("\n");}
if(m==8)
{
printf("左右子树进行交换:\n");
if(exchange(T)==1)
printf("交换完成!\n");
printf("交换后中序遍历为:\n");
InOrder(T);
printf("\n");
printf("交换后先序遍历为:\n");
PrtOrder(T);
printf("\n");
printf("交换后后序遍历为:\n");
PostOrder(T);
printf("\n");
printf("交换后层次遍历为:\n");
initilize();
LevelOrder(T);
printf("\n");}
if(m==9)
{
printf("请输入某个X结点:");
getchar();
x=getchar();
p=preorder_x(T,x);
y=depth(p);
printf("深度结果如下:%d\n",y);
}
if(m==10)
exit(1);
}
}
《实验四》
最新推荐文章于 2022-03-27 22:34:35 发布