二叉树的基础算法

我们这里以                     A

                                 B        C

                            #       E    #    E

                                  #    #    #    #  

为例

1.二叉树的创建

BTNode * CreatTree()  
{
	BTNode *T;
	char a;
	scanf("%c",&a);   //注意输入顺序为  AB#E##C#E##   也就是现存的是A的左子树,再存A的右子树(#表示没有存数据) 
	if(a=='#')
		T=NULL;
	else
	{
		T=(BTNode *)malloc(sizeof(BTNode));
		T->data=a;
		T->Lchild=CreatTree();//先存左子树
		T->Rchild=CreatTree();
	 } 
	 return T;
}

2.二叉树的三种遍历

//先序遍历 
void Pre_print(BTNode *p) 
{
	if(p==NULL)
		return ;
	else
	{
		printf("%c ",p->data);
		Pre_print(p->Lchild);
		Pre_print(p->Rchild);
	}
	
}
//中序遍历
void Mid_print(BTNode *p) 
{
	if(p==NULL)
		return;
	else
	{
		Mid_print(p->Lchild);
		printf("%c ",p->data);
		Mid_print(p->Rchild);
	}
}
//后序遍历
void Post_print(BTNode *p) 
{
	if(p==NULL)
		return ;
	else
	{
		Post_print(p->Lchild);
		Post_print(p->Rchild);
		printf("%c ",p->data);
	}

3.二叉树的层序遍历

//层序输出 
void Level_print(BTNode *T,int level)   
{
	//空树或层级不合理 
	if(T==NULL||level<1)
		return ;
	if(level==1)
		printf("%c ",T->data);
	//左子树level-1 
	Level_print(T->Lchild,level-1);
	//右子树层级-1 
	Level_print(T->Rchild,level-1);
} 

//层序遍历 
void Level_Traveral(BTNode *T) 
{
	if(T==NULL)
		return ;
	int depth=Depth(T);	
	for(int i=1;i<=depth;i++)
	{
		Level_print(T,i);
		printf("\n");
	}
} 

4.求二叉树的深度(高度)

int Depth(BTNode *T)  
{
	int Reft_depth,Left_depth;
	if(T==NULL)
		return 0;
	else
	{
		Reft_depth=Depth(T->Lchild);
		Left_depth=Depth(T->Rchild);  
	}
	return (Reft_depth>Left_depth?Reft_depth:Left_depth)+1;
} 

5.求二叉树的节点数

int NodeCount(BTNode *T)  
{
	int num1,num2;
	if(T==NULL)
		return 0;
	else
	{
		num1=NodeCount(T->Lchild);
		num2=NodeCount(T->Rchild);
		return (num1+num2)+1;
	}		
} 

6.求二叉树的叶子节点数目

int LeafNode(BTNode *T)
{
	int num1,num2;
	if(T==NULL)
		return 0;
	else if(T->Lchild==NULL&&T->Rchild==NULL)
		return 1;
	else
	{
		num1=LeafNode(T->Lchild);
		num2=LeafNode(T->Rchild);
		return (num1+num2);
	}
}
下面为全部代码
#include<stdio.h>
#include<stdlib.h>
/**	创建  
1	深度     
1	三种遍历  
1	层序遍历  
1	叶子节点个数 
1	节点个数  
	
*/
typedef struct node{
	char data;
	node *Rchild,*Lchild;
}BTNode;
//创建二叉树 
/**
  *注意输入时  先输入左子树全部数据,再输入右子树全部数据 
  */
BTNode * CreatTree()  
{
	BTNode *T;
	char a;
	scanf("%c",&a);
	if(a=='#')
		T=NULL;
	else
	{
		T=(BTNode *)malloc(sizeof(BTNode));
		T->data=a;
		T->Lchild=CreatTree();
		T->Rchild=CreatTree();
	 } 
	 return T;
}
//先序遍历 
void Pre_print(BTNode *p) 
{
	if(p==NULL)
		return ;
	else
	{
		printf("%c ",p->data);
		Pre_print(p->Lchild);
		Pre_print(p->Rchild);
	}
	
}
//中序遍历
void Mid_print(BTNode *p) 
{
	if(p==NULL)
		return;
	else
	{
		Mid_print(p->Lchild);
		printf("%c ",p->data);
		Mid_print(p->Rchild);
	}
}
//后序遍历
void Post_print(BTNode *p) 
{
	if(p==NULL)
		return ;
	else
	{
		Post_print(p->Lchild);
		Post_print(p->Rchild);
		printf("%c ",p->data);
	}
}
//求树的深度(高度)
int Depth(BTNode *T)  
{
	int Reft_depth,Left_depth;
	if(T==NULL)
		return 0;
	else
	{
		Reft_depth=Depth(T->Lchild);
		Left_depth=Depth(T->Rchild);  
	}
	return (Reft_depth>Left_depth?Reft_depth:Left_depth)+1;
} 

//层序输出 
void Level_print(BTNode *T,int level)   
{
	//空树或层级不合理 
	if(T==NULL||level<1)
		return ;
	if(level==1)
		printf("%c ",T->data);
	//左子树level-1 
	Level_print(T->Lchild,level-1);
	//右子树层级-1 
	Level_print(T->Rchild,level-1);
} 
//层序遍历 
void Level_Traveral(BTNode *T) 
{
	if(T==NULL)
		return ;
	int depth=Depth(T);	
	for(int i=1;i<=depth;i++)
	{
		Level_print(T,i);
		printf("\n");
	}
} 
//求节点个数 
int NodeCount(BTNode *T)  
{
	int num1,num2;
	if(T==NULL)
		return 0;
	else
	{
		num1=NodeCount(T->Lchild);
		num2=NodeCount(T->Rchild);
		return (num1+num2)+1;
	}		
} 
//求叶子节点数 
int LeafNode(BTNode *T)
{
	int num1,num2;
	if(T==NULL)
		return 0;
	else if(T->Lchild==NULL&&T->Rchild==NULL)
		return 1;
	else
	{
		num1=LeafNode(T->Lchild);
		num2=LeafNode(T->Rchild);
		return (num1+num2);
	}
}
int main()
{
	BTNode *T;
	T=CreatTree();
	printf("先序:"); 
	Pre_print(T);
	printf("\n");
	printf("中序:"); 
	Mid_print(T);
	printf("\n");
	printf("后序:");
	Post_print(T);
	printf("\n"); 
	printf("树的深度:%d\n",Depth(T));
	printf("树的节点个数:%d\n",NodeCount(T)); 
	printf("叶子节点个数:%d\n",LeafNode(T));printf("层序遍历\n");
	Level_Traveral(T);
	return 0;	
} 

运行结果:


猜你喜欢

转载自blog.csdn.net/qq_41262903/article/details/79880043