答案是递归法最常用,定义TreeNode结构后,通过判断根节点是否为空,返回1加左右子树节点数之和,实现简洁高效。

在C++中统计二叉树的节点个数,最常用的方法是通过递归遍历整棵树。只要每个节点都被访问一次,就可以准确计数。
使用递归方式统计节点数量
从根节点开始,每遇到一个节点就加1,然后递归计算左子树和右子树的节点数之和。
定义二叉树节点结构:
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
统计节点个数的递归函数:
立即学习“C++免费学习笔记(深入)”;
int countNodes(TreeNode* root) {
if (root == nullptr) {
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);
}
说明:如果当前节点为空,返回0;否则返回1(当前节点)加上左右子树的节点总数。
使用迭代方式(层序遍历)统计
也可以用队列实现广度优先遍历,逐个访问节点并计数。
#includeint countNodesIterative(TreeNode* root) { if (root == nullptr) return 0; std::queuezuojiankuohaophpcnTreeNode*youjiankuohaophpcn q; q.push(root); int count = 0; while (!q.empty()) { TreeNode* node = q.front(); q.pop(); count++; if (node-youjiankuohaophpcnleft) q.push(node-youjiankuohaophpcnleft); if (node-youjiankuohaophpcnright) q.push(node-youjiankuohaophpcnright); } return count;}
说明:利用队列保存待访问的节点,每次出队一个节点就计数加1,并将其子节点入队。
适用于完全二叉树的优化方法
如果是完全二叉树,可以通过判断左右子树高度来减少递归调用,将时间复杂度优化到 O(log²n)。
基本思路:若左右子树高度相同,则左子树为满二叉树,可用公式计算节点数;否则右子树为满二叉树减去部分节点。
这种优化适用于特定场景,一般情况使用简单递归即可。
基本上就这些。普通二叉树推荐使用递归方法,代码简洁且易于理解。遇到特殊结构再考虑优化策略。











