不讲武德的解法
java 实现
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
return countNodes(root.left) + countNodes(root.right) + 1;
}
}
根据完全二叉树和满二叉树的性质做
class Solution {
public int countNodes(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = getDepth(root.left);
int rightDepth = getDepth(root.right);
if (leftDepth == rightDepth) {
// 左子树是满二叉树,节点数为 2^leftDepth - 1,加上根节点和右子树
return (1 << leftDepth) + countNodes(root.right);
} else {
// 右子树是满二叉树,节点数为 2^rightDepth - 1,加上根节点和左子树
return (1 << rightDepth) + countNodes(root.left);
}
}
private int getDepth(TreeNode node) {
int depth = 0;
while (node != null) {
depth++;
node = node.left; // 完全二叉树的最左路径
}
return depth;
}
}