给出一个彻底二叉树,求出该树的节点个数java
最直观的一种解法:遍历整颗彻底二叉树,记录每个节点code
class Solution { public int countNodes(TreeNode root) { if (root == null){ return 0; } return countNodes(root.left) + countNodes(root.right) + 1; } }
但这样的话,对于本题给出的彻底二叉树性质彻底没有利用起来。首先明确彻底二叉树的定义:它是一棵空树,或者它的叶子节点只出现最后两层,若最后一层不满则叶子节点只在最左侧递归
回顾一下满二叉树的节点个数,若是满二叉树的层数为 h,则总节点数为 2h - 1,咱们对 root 节点的左右子树进行高度统计,分别记为 left 和 right,有如下两种结果:io
class Solution { public int countNodes(TreeNode root) { if(root == null){ return 0; } int left = countLevel(root.left); int right = countLevel(root.right); if(left == right){ return countNodes(root.right) + (1<<left); }else{ return countNodes(root.left) + (1<<right); } } private int countLevel(TreeNode root){ int level = 0; while(root != null){ level++; root = root.left; } return level; } }