⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 二叉树asdf.cpp

📁 数据结构的2叉树由VC编写而成
💻 CPP
字号:
#include<stdlib.h>
#include<stdio.h>

typedef  char  TElemType;

typedef struct BiTNode 
{
	TElemType data;
	struct BiTNode *LChild,*RChild; 
}BiTNode,*BiTree;

//1.构造二叉树
void CreateBiTree(BiTree &T)
{     
	char ch;
	scanf("%c",&ch);
    if(ch==' ')          
		T = NULL;
    else
	{
		T =(BiTree) malloc (sizeof(BiTNode));
		T->data=ch;
		CreateBiTree (T->LChild);
		CreateBiTree (T->RChild);
	}
} 

//2.求根结点
void  Root(BiTree  &T) 
{    
	if (T!=NULL)
	{
		printf("根结点为:%c \n",T ->data);       
	}
} 

//3.打印 
void print_btree(BiTree &T,int level) 
{ 
	if(T==NULL)
		return; 
	print_btree(T->RChild,level+1); 	
	for(int i=0;i<level;i++) 
		printf(" "); 
	printf("%c\n",T->data); 
	print_btree(T->LChild,level+1); 
} 


//4.返回双亲      ??
void Parent(BiTree  T,char M)
{
	if (T!=NULL)   
	{  
		if(T ->LChild!=NULL)
			if(T->LChild->data==M)
				printf("双亲结点为:%c\n",T->data);
		if(T ->RChild!=NULL)
			if(T->RChild->data==M)
				printf("双亲结点为:%c\n",T->data);
		Parent(T ->LChild ,M);
		Parent(T ->RChild ,M); 
	}
}

//5.左孩子
void LeftChild(BiTree  T,char M)
{
	if (T!=NULL)   
	{   
		if(T->data==M)
			if(T ->LChild==NULL)
				printf("该结点没有左孩子\n");
			else
				printf("左孩子为:%c\n",T ->LChild->data);
		LeftChild(T ->LChild ,M);
		LeftChild(T ->RChild ,M); 
	}
}

//6.右孩子          
void RightChild(BiTree  T,char M)
{
	if (T!=NULL)   
	{   
		if(T->data==M)
			if(T ->RChild==NULL)
				printf("该结点没有右孩子\n");
			else
				printf("右孩子为:%c\n",T ->RChild->data);
		RightChild(T ->LChild ,M);
		RightChild(T ->RChild ,M); 
	}
}

//7.左兄弟
void LeftSibling(BiTree  T,char M)
{
	if (T!=NULL)   
	{  
		if(T ->LChild!=NULL)
			if(T->LChild->data==M)
				printf("该结点不是右孩子\n");
		if(T ->RChild!=NULL)
		{
			if(T->RChild->data==M)
			{ 
				if(T->LChild!=NULL)
					printf("左兄弟为:%c\n",T->LChild->data);
				else
					printf("该结点没有左兄弟\n");
			}
		}
		LeftSibling(T ->LChild ,M);
		LeftSibling(T ->RChild ,M); 
	}
}


     
//8.右兄弟
void RightSibling(BiTree  T,char M)
{
	if (T!=NULL)   
	{  
		if(T ->RChild!=NULL)
			if(T->RChild->data==M)
				printf("该结点不是左孩子\n");
		if(T ->LChild!=NULL)
		{
			if(T->LChild->data==M)
			{ 
				if(T->RChild!=NULL)
					printf("右兄弟为:%c\n",T->RChild->data);
				else
					printf("该结点没有右兄弟\n");
			}
		}
		RightSibling(T ->LChild ,M);
		RightSibling(T ->RChild ,M); 
	}
}

//9.判空
void  BiTreeEmpty(BiTree  &T) 
{    
	if(T==NULL)      
		printf("该树为空树。\n");
	else
		printf("该树不为空树。\n");
} 
         
//10.求深度
int PostTreeDepth(BiTree T) 
{
	int hl, hr, max;
	if ( T!=NULL )
	{
		hl=PostTreeDepth ( T->LChild );  
		hr=PostTreeDepth ( T->RChild ); 
		max = hl>hr ? hl:hr ;              
		return(max+1);                
	}
	else   
		return(0); 
 } 


//11.先序遍历T
void  PreOrder(BiTree  &T) 
{    
	if (T!=NULL)
	{
		printf("%c ",T ->data);       
		PreOrder ( T ->LChild ); 
		PreOrder ( T ->RChild ); 
	}
} 

//12.中序遍历T
void  InOrder(BiTree  &T) 
{    
	if (T!=NULL)
	{
		InOrder( T ->LChild );    
		printf("%c ",T ->data);  
		InOrder( T ->RChild ); 
	}
} 


//13.后序遍历T
void  PostOrder(BiTree  &T) 
{    
	if (T!=NULL)
	{
		PostOrder( T ->LChild ); 
		PostOrder( T ->RChild ); 
		printf("%c ",T ->data);
	}
} 

//14.层序遍历T
void LevleOrder(BiTree &T)       //采用递归方法层次遍历二叉树T,从第一层开始,每层从左到右
{                                  
    BiTree Queue[100],b;               //一维数组表示队列,front和rear分别表示队首和队尾指针
    int front,rear;                    //定义整型类
    front=rear=0;                      //初始化队首和队尾指针front和rear
    if (T)                              //树非空
	{
		Queue[rear++]=T;                   //根结点入队列
		while (front!=rear)
		{
			b=Queue[front++];   //当队列非空 队首元素出队列,并访问这个结点
			printf("%c ",b->data);                
			if (b->LChild!=NULL) Queue[rear++]=b->LChild;    //左子树非空,则入队列
			if (b->RChild!=NULL) Queue[rear++]=b->RChild; //子树非空,则入队列
		}
	}
} 


//15.根据LR为0或1,插入c为T中p所指结点的左或右子树.p所指结点的原有左或右子树则成为c的右子树.
void InsertChild(BiTree &T, char M, int LR,BiTree &c)
{
	BiTree a;
	if (T!=NULL)   
	{   
		if(T->data==M)
			if(LR==0)
			{
				a=T->LChild;
				T->LChild=c;
				c->LChild=a;
			}
			else
			{
				a=T->RChild;
				T->RChild=c;
				c->RChild=a;
			}
		InsertChild(T ->LChild, M, LR, c);
		InsertChild(T ->RChild, M, LR, c); 
	}
}


//17.清空二叉树
void  ClearBiTree(BiTree  &T) 
{    
	if (T!=NULL)
	{      
		ClearBiTree( T ->LChild ); 
		ClearBiTree( T ->RChild ); 
		free(T);
		T = NULL; 
	}
} 

//16.根据LR为0或1,删除T中p所指结点的左或右子树
void DeleteChild(BiTree &T, char M, int LR) 
{
	if (T!=NULL)   
	{   
		if(T->data==M)
			if(LR==0)
				ClearBiTree(T->LChild);
			else
				ClearBiTree(T->RChild);
		DeleteChild(T ->LChild ,M,LR);
		DeleteChild(T ->RChild ,M,LR); 
	}
}

//18.销毁
void  DestroyBiTree(BiTree  &T) 
{    
	if (T!=NULL)
	{      
		ClearBiTree( T ->LChild ); 
		ClearBiTree( T ->RChild ); 
		free(T);
	}
} 


//19.退出
void Tuichu(void)
{
	exit(0);
}

void main()
{
	BiTree T,c;
	char M;    
	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,  判空\n");
    printf("10, 求深度\n");
    printf("11, 先序遍历T\n");
    printf("12, 中序遍历T\n");
    printf("13, 后序遍历T\n");
    printf("14, 层序遍历T\n");
    printf("15, 特定位置插入子树\n");
    printf("16, 删除结点子树\n");
    printf("17, 清空二叉树\n");
    printf("18, 销毁\n");
    printf("19, 退出\n");

    while(1)
    {
		int number,a,LR;
        printf("\n");
        printf("请选择:");
        scanf("%d",&number);
	    switch(number)
    	{
        case 1:
			printf("请构造一个二叉树:");
			getchar();
			CreateBiTree(T);
			printf("构造成功.\n");
            break;
        case 2:
			Root(T);
            break;
        case 3:
			print_btree(T, 0) ;
            break;
        case 4:
			getchar();
			printf("请输入你要查找双亲结点的结点:");
			scanf("%c",&M);
			if(M==T->data)
				printf("该结点没有双亲结.\n");
			Parent(T,M);
            break;
        case 5:
			getchar();
			printf("请输入你要查找左孩子的结点:");
			scanf("%c",&M);
			LeftChild(T,M);
            break;
        case 6:
			getchar();
			printf("请输入你要查找右孩子的结点:");
			scanf("%c",&M);
			RightChild(T,M);
            break;
        case 7:
			getchar();
			printf("请输入你要查找左兄弟结点的结点:");
			scanf("%c",&M);
			if(M==T->data)
				printf("该结点没有左兄弟.\n");
			LeftSibling(T,M);
            break;
        case 8:
			getchar();
			printf("请输入你要查找右兄弟结点的结点:");
			scanf("%c",&M);
			if(M==T->data)
				printf("该结点没有右兄弟.\n");
			RightSibling(T,M);
            break;
        case 9:
			BiTreeEmpty(T);
            break;
        case 10:
			printf("二叉树的深度为:%d\n",a=PostTreeDepth(T));
            break;
		case 11:
			printf("二叉树的先序遍历为:");
			PreOrder(T);
			printf("\n");
            break;
		case 12:
			printf("二叉树的中序遍历为:");
			InOrder(T);
			printf("\n");
            break;
		case 13:
			printf("二叉树的后序遍历为:");
			PostOrder(T);
			printf("\n");
			break;
		case 14:
			printf("二叉树的层序遍历为:");
			LevleOrder(T);
			printf("\n");
			break;
		case 15:
			printf("请构造一个与要原有二叉树不相交的二叉树:");
			getchar();
			CreateBiTree(c);
			printf("构造成功.\n");
			getchar();
			printf("请输入你要插入子树的二叉树结点:");
			scanf("%c",&M);
			printf("如果你要插入的是在左子数请输入0,否则请输入1:");
			scanf("%d",&LR);
			InsertChild(T, M, LR, c);
            break;
        case 16:
			getchar();
			printf("请输入你要删除子树的结点:");
			scanf("%c",&M);
			printf("如果你要删除的是左子数请输入0,否则请输入1:");
			scanf("%d",&LR);
			DeleteChild(T, M, LR);
			printf("该子树已删除\n");
            break;
        case 17:
			ClearBiTree(T);
			printf("该二叉树已清空\n");
            break;
        case 18:
			DestroyBiTree(T);
			printf("该二叉树已销毁\n");
            break;
        case 19:
			Tuichu();
            break;
        default:;
    	}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -