思路:
1、利用完全二叉树的性质,判断头节点的右子树的最左节点是否和头节点的最左节点在同一层
2、如果是同一层,说明头节点的左子树是一个满二叉树,利用公式计算出左子树的节点个数,再加上头节点,个数为
2^(h-1)-1+1=2^(h-1),接下来再计算右子树的个数,可以用递归的方式求出来
3、如果不再同一层,则右子树是一个满二叉树,可以用公式计算出右子树的节点个数,再加上头节点,也就是2^(h-l-1),l表示节点所在的层数
def nodeNum(head):
def getMostLeftLevel(head,level):
if head == None:
return 0
while head!=None:
level +=1
head = head.left
return level - 1
def bs(head,level,height):
if level == height:
return 1
if getMostLeftLevel(head.right,level+1) == height:
return (1<<(height-1)) + bs(head.right,level+1,height)
else:
return (1<<(height-level-1)) + bs(head.left,level+1,height)
if head == None:
return 0
return bs(head,1,getMostLeftLevel(head,1))