思路
普通解法是顺着思路递归就可以AC,看到题解里有利用完全二叉树的性质进行计算感觉十分有趣,遂尝试下这种思路。
- 完全二叉树是满二叉树的一个变种,假如左右子树高度相同说明左子树为满二叉树,直接计算之再对右子树进行递归统计;假如左子树比右边子树高说明最后一整层没满but倒数第二层满了计算右子树再对左子树递归之。
该思路的代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//计算从某节点向下的树的深度(or层数)
private int count(TreeNode node){
int level = 0;
while(node!=null){
level++;
node = node.left;
}
return level;
}
public int countNodes(TreeNode root) {
if(root==null) return 0;
int left = count(root.left);
int right = count(root.right);
if(left ==right){
return countNodes(root.right)+(1<<left);
}else{
return countNodes(root.left)+(1<<right);
}
}
}