数据结构 | c++编程实现求二叉树的叶节点的个数。(递归&非递归)
2023-12-15 13:36:07
目录
非递归
#include<iostream>
#include<stack>
using namespace std;
struct BTNode
{
int data;
BTNode* left, * right;
BTNode(int val) :data(val), left(NULL), right(NULL) {}
};
//递归的方式求二叉树的叶子结点数
int countnode(BTNode* t) //采用int类型而非bool类型 bool类型最后只有0和1
{
if (t == NULL)
return 0;
stack<BTNode*>s1, s2; //两个栈一个存放临时节点,一个存放应经找到的叶子结点
s1.push(t); //将根节点放入栈中
bool flag = false; //用来标识有无叶子结点
while (!s1.empty())
{
BTNode* node = s1.top();//取栈顶元素
s1.pop();
if (node->left == NULL && node->right == NULL)
{
s2.push(node);
flag = true; //有叶子结点 标识变true
}
else
{
if (node->left != NULL) //根节点的哪边不为空就把它塞到s1这个栈里面
{
s1.push(node->left);
}
if (node->right != NULL)
{
s1.push(node->right);
}
}
}
int count = 0;
while (!s2.empty())
{
count++;
s2.pop();
}
return flag ? count : 0;
}
int main()
{
BTNode* root = new BTNode(1);
root->left = new BTNode(2);
root->right = new BTNode(3);
root->left->left = new BTNode(4);
root->left->right = new BTNode(5);
root->right->left = new BTNode(6);
root->right->right = new BTNode(7);
cout << "叶子结点个数:" << countnode(root) << endl;
return 0;
}
递归
#include<iostream>
#include<stack>
using namespace std;
struct BTNode
{
int data;
BTNode* left, * right;
BTNode(int val):data(val),left(NULL),right(NULL){}
};
//递归的方式求二叉树的叶子结点数
int countnode( BTNode* t) //采用int类型而非bool类型 bool类型最后只有0和1
{
if (t == NULL)
return 0;
if (t->left == NULL && t->right == NULL)
{
return 1;
}
return (countnode(t->left) + countnode(t->right)); //递归调用函数求解根节点左孩子的叶子结点和右孩子的叶子结点
}
int main()
{
BTNode* root = new BTNode(1);
root->left = new BTNode(2);
root->right = new BTNode(3);
root->left->left = new BTNode(4);
root->left->right = new BTNode(5);
root->right->left = new BTNode(6);
root->right->right = new BTNode(7);
cout << "叶子结点个数:" << countnode(root) << endl;
return 0;
}
文章来源:https://blog.csdn.net/kazuma_hn/article/details/134927004
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!