题目:
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
输出: 6
/**
- 有两种可能:
- 1、hl= hr左子树满,直接计算左子树,然后递归右子树
- 2、hl>hr 右子树为满树,比左子树矮一层,直接计算右子树节点,然后递归左子树
- 时间复杂度O(h^2) h为树高
*/
public int countNodes(TreeNode root) {
if (root == null)
return 0;
int hl = depth(root.left);
int hr = depth(root.right);
if (hl == hr) {
// 注:1 为根节点 (1 << hl) - 1 为左子树节点个数 countNodes(root.right)为右子树节点个数
return 1 + ((1 << hl) - 1) + countNodes(root.right);
} else {
return 1 + ((1 << hr) - 1) + countNodes(root.left);
}
}
private int depth(TreeNode node) {
int d = 0;
while (node != null) {
node = node.left;
d++;
}
return d;
}