目录
- 递归法
 - 改进
 
题目来源
222. 完全二叉树的节点个数
递归法
递归三步曲
- 1.确定递归函数的参数和返回值
参数就是传入树的根节点,返回就返回以该节点为根节点二叉树的节点数量,所以返回值为int类型。 
int countNodes(TreeNode root)
 
- 2.确定终止条件
 
如果为空节点的话,就返回0,表示节点数为0。
        if(root == null){
            return 0;
        }
 
- 3.确定单层递归的逻辑
 
先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。
        int leftNum  = countNodes(root.left);
        int rightNum  = countNodes(root.right);
        int treeNum = leftNum + rightNum + 1;
        return treeNum;
 
整体代码如下
 
改进
在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。
 举一个典型的例子如题:
 
 完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
 对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
 对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
 像这种就可以不用进入递归,直接返回(2 << leftDepth) - 1
 
class Solution {
    public int countNodes(TreeNode root) {
        if(root == null){
            return 0;
        }
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
        while(left!=null){
            left = left.left;
            leftDepth++;
        }
        while (right!=null) { // 求右子树深度
            right = right.right;
            rightDepth++;
        }
        if(leftDepth == rightDepth){
            return (2 << leftDepth) - 1;
        }
        int leftNum  = countNodes(root.left);
        int rightNum  = countNodes(root.right);
        int treeNum = leftNum + rightNum + 1;
        return treeNum;
    }
}
 




















