题目链接
完全二叉树的节点个数
题目描述
注意点
- 题目数据保证输入的树是完全二叉树
解答思路
- 最初想到的是递归计算子树对应的节点数量,相加就是整个二叉树的节点个数,但是该方法没有用到完全二叉树的特点,考虑是否有更加巧妙地方法
- 根据完全二叉树的特点:左子树的节点个数一定不会比右子树的少(最后一层叶子节点都集中在左侧),且除最后一层外,前n层的节点总数为[2^n - 1]个
- 遍历到任意一个根节点时,可以根据其左右子树的高度计算其左右子树的节点个数,如果左子树的高度leftHeight等于右子树的高度rightHeight,说明左子树的节点总数为2^left - 1,右子树需要继续递归确认;如果leftHeight大于rightHeight,说明右子树的节点总数为2^right- 1,左子树需要继续递归确认
代码
class Solution {public int countNodes(TreeNode root) {if (root == null) {return 0;}int leftHeight = countHeight(root.left);int rightHeight = countHeight(root.right);// 左子树为完全二叉树,右子树不确定if (leftHeight == rightHeight) {return (1 << leftHeight) + countNodes(root.right);}// 右子树为完全二叉树,左子树不确定return countNodes(root.left) + (1 << rightHeight);}public int countHeight(TreeNode root) {if (root == null) {return 0;}return countHeight(root.left) + 1;}
}
关键点
- 完全二叉树的特点
- 根据左右子树的高度确定左右子树是否是完全二叉树