50 lines
1.7 KiB
Java
50 lines
1.7 KiB
Java
package tree;
|
||
/**
|
||
* 题目: 222. 完全二叉树的节点个数 (countNodes)
|
||
* 描述:给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
|
||
* 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(从第 0 层开始),则该层包含 1~ 2h 个节点。
|
||
*
|
||
示例 1:
|
||
输入:root = [1,2,3,4,5,6]
|
||
输出:6
|
||
|
||
* 链接:https://leetcode.cn/problems/count-complete-tree-nodes/
|
||
*/
|
||
//没想出小于o(n)的方法
|
||
public class CountNodes {
|
||
public int countNodes(TreeNode root) {
|
||
// 空树直接返回 0
|
||
if (root == null) {
|
||
return 0;
|
||
}
|
||
|
||
// 用两个指针分别遍历左子树最左侧和右子树最右侧,
|
||
// 目的是快速判断当前子树是否为满二叉树
|
||
TreeNode l = root, r = root;
|
||
int hl = 0, hr = 0;
|
||
|
||
// 计算左子树从根到最左叶节点的高度
|
||
while (l != null) {
|
||
l = l.left;
|
||
hl++;
|
||
}
|
||
|
||
// 计算右子树从根到最右叶节点的高度
|
||
while (r != null) {
|
||
r = r.right;
|
||
hr++;
|
||
}
|
||
|
||
// 如果左右高度相同,则说明这是一棵满二叉树
|
||
// 满二叉树节点数 = 2^h - 1
|
||
if (hl == hr) {
|
||
// 使用位运算更高效:1 << hl 相当于 2^hl
|
||
return (1 << hl) - 1;
|
||
}
|
||
|
||
// 否则,当前树不是满二叉树,
|
||
// 则根据「根 + 左子树节点数 + 右子树节点数」递归计算
|
||
return 1 + countNodes(root.left) + countNodes(root.right);
|
||
}
|
||
}
|