题目描述

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例 1:


输入:root = [1,2,3,4,5,6]
输出:6


示例 2:

输入:root = []
输出:0


示例 3:

输入:root = [1]
输出:1

进阶:遍历树来统计节点是一种时间复杂度为 O(n) 的简单解决方案。你可以设计一个更快的算法吗?

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/

解题思路

完全二叉树是由满二叉树(每层都是满的节点)和完全二叉树构造出来的,满二叉树节点数量是  2的n次方-1 (n是树的层数);完全二叉树的节点数量可以用普通的方式计算,分别计算左右子树,然后加上跟节点,可以用递归实现

思路参考:https://labuladong.gitbook.io/algo/shu-ju-jie-gou-xi-lie/shou-ba-shou-shua-er-cha-shu-xun-lian-di-gui-si-wei/wan-quan-er-cha-shu-jie-dian-shu

解题代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int hl = 0, hr = 0;
        TreeNode l = root, r = root;
        //计算左子树深度
        while(l != null) {
            l = l.left;
            hl++;
        }
        //计算右子树深度
        while(r != null) {
            r = r.right;
            hr++;
        }
        //如果左右深度一致,代表是完全二叉树
        if(hl == hr) {
            return (int)Math.pow(2, hl)-1;
        }
        //普通二叉树节点计算方式
        return 1 + countNodes(root.left) + countNodes(root.right);
    }
}