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); } }