/**
* 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;
}
TreeNode left = root.left;
TreeNode right = root.right;
int leftHight = 0, rightHeight = 0;
while (left != null) {
leftHight++;
left = left.left;
}
while (right != null) {
rightHeight++;
right = right.right;
}
if (rightHeight == leftHight) {
return -1 + (2 << rightHeight);
}
return 1 + countNodes(root.left) + countNodes(root.right);
}
}
这两种不算完全二叉树
while处是logn级别实际上可以用二进制的移位进行理解,每一层树都是其实都是类似于二进制码0111,0011,0001,分别代表三层树,两层树,一层树,而从0001到0011,因为0011可以看作0100-1,当舍去1,就变成了0100,也就是0001先左移了2位,而这个移位实际上就是log(0100)等于2约等于log(0011),而0011等于第二层包括第一层全部的节点数量
当理解了上面的概念,那么就可以试着理解下这里的递归实际上就是相当于二进制码的移位,每一次递归,都可以想象有一个对应的log(n)指针指向当前的根节点,所以有log(n),然后,再看while循环实际上就是将一个大小为n的数据,通过类似于递归一样的去移动对应的指针,然后再利用和2的关系直接左移,就免去了遍历这个子树的全部节点