分别检查左右子树的高度left和right。如果left == right则说明左子树一定是满树,那么左子树加上根节点的node个数为2^left,我们再recursively计算右子树的节点就可以了。如果left > right = left - 1则说明右子树是满树,那么右子树加上根加点的node个数为2^right,我们再recursively计算左子树的节点就可以了。还有一个需要注意的点是移位运算符的优先级低于加法,所以需要加上小括号。代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
int count = 0;
int left = height(root.left);
int right = height(root.right);
if(left == right){
count = (1 << (left)) + countNodes(root.right);
}else if(left > right){
count = (1 << (right)) + countNodes(root.left);
}
return count;
}
private int height(TreeNode root){
if(root == null){
return 0;
}
return Math.max(height(root.left), height(root.right)) + 1;
}
}