栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《实验四》

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《实验四》

#include
#include
#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("树的深度:%dn",n);}
	if(m==5)
	{n = NodeCount(T);
	printf("树的结点数:%dn",n);}
	if(m==6)
	{n = LeafCount(T);
	printf("叶子结点数:%dn",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("深度结果如下:%dn",y);
	}
	if(m==10)
		exit(1);
	
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/676487.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号