树与图简单2 种解法
#222完全二叉树的节点个数
统计一棵完全二叉树的节点总数。
#完全二叉树#深度优先搜索#广度优先搜索
解题主线
01
普通遍历适用于所有二叉树,也自然适用于完全二叉树。
解法 1:递归计数
节点总数等于左子树节点数加右子树节点数再加一。
时间复杂度
O(n)
空间复杂度
O(h)
java
import java.util.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
return countNodes(root.left) + countNodes(root.right) + 1;
}
}节点总数等于左子树节点数加右子树节点数再加一。
解法 2:BFS 计数
每个节点出队时计数并加入其非空孩子。
时间复杂度
O(n)
空间复杂度
O(w)
java
import java.util.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
class Solution {
public int countNodes(TreeNode root) {
if (root == null) return 0;
Deque<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
int count = 0;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
count++;
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
return count;
}
}每个节点出队时计数并加入其非空孩子。
边界与易错点
- 队列计数不需要按层,但保留分层也不会影响正确性。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
leetcode/src/main/java/tree/Q222_countNodes.java