二叉树基本操作代码实现

#include <stdio.h>
#include <stdlib.h> //exit
#include<malloc.h>
//定义二叉链表结点结构
typedef struct node{
	int   data;
	struct node  *lchild, *rchild;
}BiTree;
//创建二叉链表
BiTree  *CreateBiTree( )
{  
	BiTree  *T;	
	int  x;  
    scanf("%d",&x);
    if(x==0)  T=NULL;
    else 
    {  
		if(!(T=(BiTree*)malloc(sizeof(BiTree))))         
             exit(-1);
        T->data = x;
        T->lchild =CreateBiTree();
        T->rchild =CreateBiTree();
    }
    return T;
}
//先序遍历二叉树
void  Preorder(BiTree  *T )  
{
	if(T)  
	{
		printf("%d",T->data); 
		Preorder( T->lchild );
		Preorder( T->rchild );
	}
}
//中序遍历二叉树
void  Inorder(BiTree  *T )  
{
	if(T)  
	{
		Inorder( T->lchild );
		printf("%d",T->data); 
		Inorder( T->rchild );
	}
}
//后序遍历二叉树
void  Postorder(BiTree  *T )  
{
	if(T)  
	{
		Postorder( T->lchild );
		Postorder( T->rchild );
		printf("%d",T->data); 
	}
}
//计算二叉树的深度
int Depth(BiTree *T)
{   int depl,depr;
    if(T)
    {
	  depl=Depth(T->lchild);
	  depr=Depth(T->rchild);
	  if (depl>=depr) return (depl+1);
	  else return (depr+1);
    }
    else  return 0;
}
//求二叉树结点的个数
int Total(BiTree   *T)
{  
	int  left,right;
    if (T==NULL) return 0;
    left= Total(T->lchild);
    right= Total(T->rchild);
    return 1+left+right;
}
//求结点的双亲结点
int Parent(BiTree  *T,int x)
{ //若返回值为0,则结点不在树中
  //若返回值为1,则找到双亲结点
    if(T)
    {
		if(T->data ==x) 
		{
			printf("该结点为树跟,不存在双亲");
			return 0;
		}
		else if(T->lchild&&T->lchild->data==x||T->rchild&&T->rchild->data==x)
		{
			printf("该结点为的双亲%d",T->data);
			return 1;
		}
		else
		{
			if(Parent(T->lchild, x))
				return 1;
			else
				return Parent(T->rchild, x);
		}
	}
	else return 0;
}
//判定结点所在的层次
int Level(BiTree  *T,int x,int n)
{//若返回值为0,则结点不在树中,否则返回结点的层次
	int lev;
	if(T)
	{
		if(T->data==x) return n;
		lev=Level(T->lchild,x,n+1);
		if(lev)
			return lev;
		else
			return Level(T->rchild,x,n+1);
	}
	else return 0; 
}

void freeTree(BiTree   *T)
{
	BiTree  *ltree,*rtree;
	if(T)
	{
		ltree=T->lchild;
		rtree=T->rchild;
		free(T);
		freeTree(ltree);
		freeTree(rtree);
	}
}


void main()
{
	int sel;
	BiTree   *T;
	int x;
	do{
		printf("┌─────────────────┐\n");
		printf("︳  二叉树的基本操作(二叉链表实现)  ︳\n");
		printf("︳                                  ︳\n");
		printf("︳  1  创建      2、先序遍历        ︳\n");
		printf("︳  3、中序遍历  4、后序遍历        ︳\n");
		printf("︳  5、深度      6、结点个数        ︳\n");
		printf("︳  7、求双亲    8、结点层次        ︳\n");
		printf("︳  9、退出                         ︳\n");
		printf("└─────────────────┘\n");
		printf("请选择:");
		scanf("%d",&sel);
		switch(sel)
		{
		case 1: 
			printf("\n请输入二叉树中的结点:\n");
			T=CreateBiTree();
			break;
		case 2:
			printf("\n先序遍历序列:\n");
			Preorder(T );
			break;
		case 3:
			printf("\n中序遍历序列:\n");
			Inorder(T );
			break;
		case 4:
			printf("\n后序遍历序列:\n");
			Postorder(T );
			break;
		case 5:
			printf("\n二叉树的深度为:%d\n",Depth(T));
			break;
		case 6:
			printf("\n二叉树中结点总数为:%d\n",Total(T));
			break;
		case 7:
			printf("\n请输入一个结点:\n");
			scanf("%d",&x);
			if(!Parent(T,x)) printf("\n未找到双亲");
			break;
		case 8:
			printf("\n请输入一个结点:\n");
			scanf("%d",&x);
			printf("\n该结点层次为:%d\n",Level(T,x,1));
			break;
		case 9:
			freeTree(T);
			return;
		}
		printf("\n按任意键继续....\n");
		getch();
		system("cls");
	}while(1);
	//释放链表
}

//测试数据: 
//1 2 3 0 0 4 5 0 6 0 0 7 0 0 0


posted @ 2022-12-05 10:35  Little_Monster-lhq  阅读(109)  评论(0编辑  收藏  举报