> For the complete documentation index, see [llms.txt](https://tonyding.gitbook.io/algorithm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://tonyding.gitbook.io/algorithm/lc-222-count-complete-tree-nodes.md).

# LC 222 Count Complete Tree Nodes(M)

Given a complete binary tree, count the number of nodes.

Complet Binary Tree definition: n a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.

`public int countNodes(TreeNode root)`

**边界条件** 如果root=null 结果是0.

## 解题思路 优化的递归算法

如果采用简单的递归统计所有Node，时间可能超界， 根据完全二叉树特性， 比较最左边 和最右边的Node, 如果等高，表示是个完整二叉树，节点和是 2的h次方 - 1, 程序写法是 1<\<height - 1; 如果不等高，递归法去计算左右树的节点和 ＋ 1

```java
public int countNodes(TreeNode root) {
    if (root == null)
        return 0;
    TreeNode left = root;
    TreeNode right = root;
    int height = 0;
    while(right != null){
        left = left.left; //最左节点
        right = right.right; //最右节点
        //统计高度
        height++;
    }
    if(left == null){
        //完整二叉树
        return (1<<height) - 1;
    }
    return 1 + countNodes(root.left) + countNodes(root.right);
}
```
