数据结构算法—非递归算法求二叉树的叶子结点(C语言)

数据结构算法—非递归算法求二叉树的叶子结点(C语言)

学过数据结构中 队列和栈的同学,应该都明白: 使用队列和栈,可以将递归算法转换成非递归算法
在递归算法中,需要重复调用函数时,在非递归算法中,就需要入栈,进入下一层。
在递归算法中,返回调用函数的结果时,在非递归算法中,就需要出栈,返回到上一层

#include<stdio.h>
#include<malloc.h>
struct node{
   
   
	char info;
	struct node *llink,*rlink;
};
typedef struct node NODE;
NODE *creat(){
   
   
	char x;
	NODE *p;
    scanf("%c",&x);
	printf("%c",x);
	if</
在C语言中,二叉树的叶子节点总数可以采用迭代而非递归的方式,通常我们会使用栈来辅助计算。以下是一个简单的非递归算法步骤: 1. 初始化两个变量:`count`用于存储叶子节点的数量,初始化为0;`current`用于当前访问的节点,初始设置为根节点。 2. 当`current`不为空时,做如下操作: a. 如果`current`是叶子节点(即没有左孩子和右孩子的节点),则`count++`,然后将`current`设为其父节点(如果有的话)。 b. 否则,先将`current`的右孩子入栈,再将其左孩子入栈。这样保证了总是先处理左孩子,因为当我们处理完左孩子后,左孩子已经从栈顶移除,不会再次进入循环。 c. 重复这个过程,直到`current`变为NULL。 3. 当栈为空时,所有叶子节点都已经处理过,返回`count`作为结果。 以下是C语言代码实现的例子: ```c #include <stdio.h> #include <stdbool.h> typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; int countLeaves(TreeNode* root) { if (!root) return 0; // 如果节点为空,则结束 stack<TreeNode*> s; s.push(root); // 将根节点压入栈 while (!s.empty()) { TreeNode* node = s.top(); s.pop(); if (!node->left && !node->right) { // 如果找到叶子节点 ++countLeaves; } if (node->right) s.push(node->right); if (node->left) s.push(node->left); } return countLeaves; } // 示例用法 int main() { TreeNode* tree = ...; // 实例化并构建你的二叉树 int leafCount = countLeaves(tree); printf("二叉树的叶子节点数为:%d\n", leafCount); return 0; }
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值