二叉树叶子结点个数统计

1.问题描述:

输入一棵二叉树,求出其叶子结点个数。

2.实验要求:

(1)设计二叉树的二叉链表存储结构

(2)设计求叶子结点个数的递归算法

(3)输入一棵二叉树

(4)输出二叉树的叶子节点个数

示例:

ab#c##d##

二叉树叶子结点个数为:

3.程序实现:

(1)代码:

#include<iostream>
using namespace std;
//二叉树结点
typedef struct BTNode 
{
	char root;
	struct BTNode* lchild;
	struct BTNode* rchild;
}BTree;

//创建二叉树
BTree* CreateBinaryTree() 
{
	char ch;
	cin >> ch;
	BTree* node;

	if (ch == '#') {
		node = NULL;
	}
	else {
		node = (BTree*)malloc(sizeof(BTree));
		if (ch) {
			node->root = ch;
			node->lchild = CreateBinaryTree();
			node->rchild = CreateBinaryTree();
		}
	}
	return node;
}

//二叉树叶子结点个数
int CountLeaf(BTree* root, int* count) 
{
	if (root != NULL && root->lchild == NULL && root->rchild == NULL) {
		(*count)++;
	}

	if (root != NULL) {
		CountLeaf(root->lchild, count);
		CountLeaf(root->rchild, count);
	}
	return *count;
}

int main() 
{
	//创建二叉树
	BTree* root = CreateBinaryTree();

	//二叉树叶子结点个数
	int count = 0;
	cout << "二叉树叶子结点个数为:" << CountLeaf(root, &count) << endl;
	return 0;
}

(2)算法理解:

先定义好二叉树的存储结构,然后再建立一个二叉树,最后运用递归求出叶子结点。

4.测试与运行:

 5.思考题:

如何设计非递归算法求叶子结点的个数?设计相关算法

使用队列和栈,可以将递归算法转换成非递归算法
递归算法中,需要重复调用函数时,在非递归算法中,就需要入栈,进入下一层。
在递归算法中,返回调用函数的结果时,在非递归算法中,就需要出栈,返回到上一层。


int Count_BiTree0(BiTree T)
{
    int top=-1;     //此时栈为空
    int count =0;   
    BiTree S[MaxSize];
 
    while(T!=NULL || top != -1)
    {
        while (T != NULL)
        {
            if(T->lchild == NULL && T->rchild == NULL)
            {
                count++;
            }
            S[++top] = T;   //++top(top初始为-1),then将当前的根节点入栈
            T = T->lchild;  //访问当前根节点的左子树
        }
        if(top != -1)
        {
            T = S[top--];   //获取当前的根节点
            T = T->rchild;  //访问当前根节点的右子树
        }
    }
 
    return count;
}

原文链接:https://blog.csdn.net/h420405961/article/details/120816477

6.实验心得体会:
熟练掌握二叉树的结点结构,理解并运用如何创建一棵二叉树。掌握递归方法。理解指针的使用,必须指向同类型的值,不可以出现野指针。创建函数时,注意形参和实参的统一。

  • 25
    点赞
  • 240
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SweetCinderella

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值