二叉链表的定义与基本操作实现函数

#include
#include

typedef int TElemtype;

typedef struct BiTNode{
	TElemtype data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
#include"binary_tree.h"
main()
{
	BiTree T,T1,T2;
	InitBiTree(T);
	InitBiTree(T1);
	printf("提示输入-1代表为空!");
	putchar(10); 
	CreateBiTree(T);
//	int x;
//	scanf("%d",&x);
//	int xroot;
//	xroot= Xfind(T,x);
//	printf("%d",xroot);
	putchar(10);
	int u,k;
	printf("总结点数:%d\n",u=JDcount(T));
	printf("叶子节点数:%d\n",k=YJDcount(T)); 
	BiTreeEmpty (T);
	putchar(10);
	int high;
	high=BiTreeDepth(T);
	printf("深度为:%d",high);
	putchar(10);
	PreOrderTraverse(T);
	putchar(10);
	InOrderTraverse (T);
	putchar(10);
	PostOrderTraverse (T);
	putchar(10);
	CreateBiTree(T1);
	int a=xiangsi(T,T1);
	if(a==1)printf("相似");
	else printf("不相似");
	putchar(10); 
	DestroyBiTree(T);
	BiTreeEmpty (T);
	return 0;
}
/*~~~~~~~~~~~~~~~~~~*/
void InitBiTree(BiTree &T) //初始化二叉树T 
{
	T=(BiTree)malloc(sizeof(BiTNode));
	if(!T)exit(-2);	
} 
int CreateBiTree(BiTree &T) //按先序遍历序列建立二叉链表T 
{
	TElemtype	e;
	scanf("%d",&e);
	if(e==-1)
	{
		T=NULL;
	}	
	else
	{
		T=(BiTree)malloc(sizeof(BiTNode));
		if(!T)exit(-2);
		T->data=e;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
	return 1;
}    
bool BiTreeEmpty (BiTree T) //检查二叉树T是否为空,空返回1,否则返回0      
{
	if(T==NULL)
	{
		printf("Destroyed!"); 
		return 1;
	}
	else
	{
		printf("二叉树不为空!"); 
		return 0;
	}

} 
int BiTreeDepth(BiTree T) //求二叉树T的深度并返回该值 
 {
 	int a=0,b=0;
 	if(T==NULL)
 	{
 		return 0;
 	}
 	else
 	{
 		a=BiTreeDepth(T->lchild);
 		b=BiTreeDepth(T->rchild);
 	}
 	return a>b ? a+1:b+1;
 }   
                   
void PreOrderTraverse (BiTree T) //先序遍历二叉树T    
{
	if(T==NULL)
	{
		return;
	}
	else
	{	printf("%d ",T->data);
		PreOrderTraverse (T->lchild);
		PreOrderTraverse (T->rchild);
	}
}

void InOrderTraverse (BiTree T) //中序遍历二叉树T
{
	if(T==NULL)
	{
		return;
	}
	else
	{	
		InOrderTraverse (T->lchild);
		printf("%d ",T->data);
		InOrderTraverse (T->rchild);
	}	
} 
 
void PostOrderTraverse (BiTree T) //后序遍历二叉树T
{
	if(T==NULL)
	{
		return;
	}
	else
	{	
		PostOrderTraverse (T->lchild);
		PostOrderTraverse (T->rchild);
		printf("%d ",T->data);
	}	
} 

void DestroyBiTree(BiTree &T) //销毁二叉树T       
{
	if(T)
	{
		DestroyBiTree(T->lchild);
		DestroyBiTree(T->rchild);
		free(T);
		T=NULL;
	}
		
} 

int JDcount(BiTree T)  
{
	if(T!=NULL)
	{
		return 1+JDcount (T->lchild)+JDcount (T->rchild);
	}
	return 0;
}

int YJDcount(BiTree T)
{
	if(T!=NULL){
	if(T->lchild==NULL&&T->rchild==NULL){
		return 1;
	}else{
		return 0+YJDcount(T->lchild)+YJDcount(T->rchild);
		}
	}
	return 0;
}

int xiangsi(BiTree T,BiTree T1)
{
	if(T==NULL&&T1==NULL)
	{
		return 1;
	}else if(T!=NULL&T1!=NULL){
		if(xiangsi(T->lchild,T1->lchild)!=NULL&&xiangsi(T->rchild,T1->rchild)!=NULL)
		return 1;
		else
		return 0;
	}
	else return 0;
}





你可能感兴趣的:(数据结构与算法)