《实验四》

#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);
	
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值