求二叉树的高度和叶子结点的个数

本文详细介绍了二叉树的基本操作,包括使用递归方式创建二叉树、计算叶子节点数量及求二叉树的高度。通过具体代码实现,帮助读者深入理解二叉树的遍历与属性计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

叶子结点即是左右子树都为空的结点,求叶子结点的个数。

1.先运用递归的方式创建二叉树,上篇已经提过,可以自行查阅,此处不做赘述

//创建二叉树
Status CreateBiTree(BiTree &T)
{
       char ch;
       scanf("%c",&ch);
       if (ch=='.') T = NULL;
       else {
                if (!(T=(BiTree)malloc(sizeof(BiTNode))))
                    return OVERFLOW;
                T->data = ch;
                CreateBiTree(T->Lchild);
                CreateBiTree(T->Rchild);
       }
       return OK;
} 

2.求叶子结点个数

//求叶子结点数目
int leaves(BiTree root)
{
	int k = 0;
	if (!root)
	   return 0;
        else
	   if (root->Lchild==NULL&&root->Rchild==NULL)
	       k++;

	   else {
                    //递归遍历所有结点,若遇到左右孩子都为空,则给k加1
	   	   if (root->Lchild)  leaves(root->Lchild);
	   	   if (root->Rchild)  leaves(root->Rchild);
	   	
	   }	   	   
	   return k;
}  

3.求二叉树的高度

//运用递归求二叉树的高度
int BiTreeHeight(BiTree root)
{
	int LH,RH;
	if(!root)
		return 0;
	else
	{
		LH=BiTreeHeight(root->Lchild );//左子树高度
		RH=BiTreeHeight(root->Rchild );//右子树高度
		if(LH>RH)
			return LH+1;
			else return RH+1;
	}
 } 

4.完整代码

#include <stdio.h>
#include <stdlib.h>

typedef int Status;
typedef struct BiTNode{
        char data;
        struct BiTNode *Lchild,*Rchild;
}BiTNode, *BiTree;

#define OK 1
#define ERROR 0
#define OVERFLOW -1

int k; //全局变量记录叶子结点的个数

//创建二叉树
Status CreateBiTree(BiTree &T)
{
       char ch;
       scanf("%c",&ch);
       if (ch=='.') T = NULL;
       else {
                if (!(T=(BiTree)malloc(sizeof(BiTNode))))
                    return OVERFLOW;
                T->data = ch;
                CreateBiTree(T->Lchild);
                CreateBiTree(T->Rchild);
       }
       return OK;
} 

//输出先序序列
void preorder (BiTree root)  {//先序遍历root指向根的二叉树
          if (root!=NULL)   { 
              printf("%c",root->data);//访问根结点
              preorder(root->Lchild); //先序遍历根的左子树            
              preorder(root->Rchild); //先序遍历根的右子树
          }//if
    }//preorder

//求叶子结点数目
int leaves(BiTree root)
{
	
	if (!root)
	   return 0;
    else
	   if (root->Lchild==NULL&&root->Rchild==NULL)
	       k++;
	   else {
	   	   if (root->Lchild)  leaves(root->Lchild);
	   	   if (root->Rchild)  leaves(root->Rchild);
	   	
	   }	   	   
	   return k;
}  

//求树高
int BiTreeHeight(BiTree root)
{
	int LH,RH;
	if(!root)
		return 0;
	else
	{
		LH=BiTreeHeight(root->Lchild );
		RH=BiTreeHeight(root->Rchild );
		if(LH>RH)
			return LH+1;
			else return RH+1;
	}
 } 

//主函数
int main()
{
    BiTree root;
    CreateBiTree(root);
    preorder(root);
    
    printf("\n");
    printf("leaves = %d\n",leaves(root));
    printf("Height = %d\n", BiTreeHeight(root));
    system("pause"); 
    return 0;
}

5.运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值