题目描述
给你一棵 完全二叉树 的根节点 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是树的层数);完全二叉树的节点数量可以用普通的方式计算,分别计算左右子树,然后加上跟节点,可以用递归实现
解题代码
/**
* 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);
}
}