【算法导论】求二叉树的叶子数和深度

简介: 二叉树的叶子数和深度 二叉树的遍历算法是许多二叉树运算的算法设计的基础,因此遍历算法的应用很广泛。下面以遍历算法求二叉树的叶子数和深度为例,来加深对于二叉树遍历算法的理解。

二叉树的叶子数和深度

二叉树的遍历算法是许多二叉树运算的算法设计的基础,因此遍历算法的应用很广泛。下面以遍历算法求二叉树的叶子数和深度为例,来加深对于二叉树遍历算法的理解。
1. 统计二叉树中的叶子结点数
因为叶子结点是二叉树中那些左孩子和右孩子均不存在的结点,所以可在二叉树的遍历过程中,对这种特殊结点进行计数,来完成对叶子结点数的统计。这个统计可在任何一种遍历方式下给出,下面是利用 中序遍历来实现的算法:
/**********************************************\
函数功能:计算叶子节点个数
输入:    二叉树的根节点
输出:    叶子节点个数
\**********************************************/
int countleaf(bitree *p)
{
	static int count=0;//注意这里是静态变量,也可以改为全局变量
	if(p!=NULL)
	{
		count=countleaf(p->lchild);
		if((p->lchild==NULL)&&(p->rchild==NULL))
			count=count+1;
		count=countleaf(p->rchild);
	}
	return count;
}

 2.求二叉树的深度
         二叉树的深度是二叉树中结点层次的最大值。可通过先序遍历来计算二叉树中每个结点的层次, 其中的最大值即为二叉树的深度。
具体算法如下:

/**********************************************\
函数功能:计算树的深度
输入:    二叉树的根节点、当前树的深度
输出:    树的深度
\**********************************************/
int treedepth(bitree*p,int l)
{
	static int h=0;
	if(p!=NULL)
	{
		l++;
		if(l>h)
			h=l;
		h=treedepth(p->lchild,l);
		h=treedepth(p->rchild,l);
	}
	return h;
}

两者的完整实例如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define maxsize 20

typedef int datatype;
typedef struct node
{
	datatype data;
	struct node *lchild,*rchild;
}bitree;

void Layer(bitree *p);
bitree* CreatBitree(int* arrayA,int n);
int countleaf(bitree *p);
int treedepth(bitree*p,int l);

void main()
{
	int arrayA[10]={0,1,2,3,4,5,6,7,8,9};//第一个节点没有用于存储数据
	int n=sizeof(arrayA)/sizeof(int);
    int l=0;//二叉树的深度
	bitree *head=NULL;

	head=CreatBitree(arrayA,n);

	printf("二叉树的叶子数为:%d",countleaf(head));
	printf("\n");
	printf("二叉树的深度为:  %d",treedepth(head,l));
	printf("\n");
	printf("按广度优先搜索遍历的结果为:");
//	Layer(head);
	printf("\n");

}

/*************************************************\
函数功能:建立二叉树(按照顺序方式)
输入:    原始数组
输出:    二叉树的头结点
\*************************************************/
bitree* CreatBitree(int* arrayA,int n)//顺序存储 建立二叉树
{
	bitree *root;
	bitree *queue[maxsize];
	bitree *p;
	int front,rear;
	front=1;rear=0;
	root=NULL;

	for(int i=1;i<n;i++)
	{
		p=(bitree*)malloc(sizeof(bitree));
		p->data=arrayA[i];
		p->lchild=NULL;
		p->rchild=NULL;

		rear++;
		queue[rear]=p;

		if(rear==1)
			root=p;
		else
		{
			if(i%2==0)
				queue[front]->lchild=p;
			else
			{
				queue[front]->rchild=p;
				front=front+1;
			}
		}

	}

	return root;
}
/**********************************************\
函数功能:计算叶子节点个数
输入:    二叉树的根节点
输出:    叶子节点个数
\**********************************************/
int countleaf(bitree *p)
{
	static int count=0;//注意这里是静态变量,也可以改为全局变量
	if(p!=NULL)
	{
		count=countleaf(p->lchild);
		if((p->lchild==NULL)&&(p->rchild==NULL))
			count=count+1;
		count=countleaf(p->rchild);
	}
	return count;
}

/**********************************************\
函数功能:计算树的深度
输入:    二叉树的根节点、当前树的深度
输出:    树的深度
\**********************************************/
int treedepth(bitree*p,int l)
{
	static int h=0;
	if(p!=NULL)
	{
		l++;
		if(l>h)
			h=l;
		h=treedepth(p->lchild,l);
		h=treedepth(p->rchild,l);
	}
	return h;
}
注:如果程序出错,可能是使用的开发平台版本不同,请点击如下链接:  解释说明


目录
相关文章
|
16天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
19天前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
45 5
|
22天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
25 0
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
24 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
26 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
2月前
|
存储 算法
【二叉树】—— 算法题
【二叉树】—— 算法题
【二叉树】—— 算法题
|
2月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
28 0
|
4月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
28 0
|
4月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
80 0
|
4月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
43 0