C++算法设计题:二叉树采用二叉链表存储结构,请分别用递归和非递归方法编写算法求二叉树的叶子结点的个数。
时间: 2024-10-27 16:11:39 浏览: 39
头歌数据结构二叉树的二叉链表存储及基本操作
5星 · 资源好评率100%
在C++中,我们可以使用递归和迭代的方式解决这个问题。首先,我们来看一下递归解法:
**递归方法:**
```cpp
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
};
int countLeavesRecursive(TreeNode* root) {
if (!root) return 0; // 如果节点为空,返回0
if (!root->left && !root->right) return 1; // 如果节点是叶子节点,返回1
return countLeavesRecursive(root->left) + countLeavesRecursive(root->right); // 递归左子树和右子树
}
```
在这个递归函数中,我们检查每个节点是否为叶子节点(即没有左右子节点),如果是则计数加一,如果不是则继续递归直到遍历到所有叶子节点。
**非递归方法(迭代):**
```cpp
int countLeavesIterative(TreeNode* root) {
std::vector<int> leafCount(1, 0);
while (root) {
if (!root->left && !root->right) leafCount[0]++;
root = root->left ? root->right : nullptr; // 非递归地访问下一个可能的叶子节点
}
return leafCount[0];
}
```
这里我们使用了一个辅助数组`leafCount`来保存当前找到的叶子节点数。我们在循环中逐层遍历二叉树,如果遇到叶子节点就增加计数,并更新根节点为下一个可能的叶子节点(先看右子节点,如果没有再看左子节点)。
阅读全文