def getHeight(head,level):
while head:
level+=1
head = head.left
return level-1
def bs(head,level,height):
if level == height:
return 1
#开始 level=1 而height为算出来的 相等只能是为1
h = getHeight(head.right,level+1)
if h==height:
#右边子树最左的高度到了最后一层 ,证明左边为满二叉树 2**l-1个节点 加上自己+1,然后递归右边
return (1<<(height-level))+bs(head.right,level+1,height)
else:
#没到最后一层,证明右边是满的,然后递归左边,右边满的时候高度要减一
return (1<<(height-level-1))+bs(head.left,level+1,height)
height = getHeight(head,1)
return bs(head,1,height)
if __name__=='__main__':
head = Node(1)
head.left = Node(2)
head.right = Node(3)
head.left.left = Node(4)
head.left.right = Node(5)
head.right.left = Node(6)
head.right.right = Node(7)
head.left.left.left = Node(8)
head.left.left.right = Node(9)
head.left.right.left = Node(10)
head.left.right.right = Node(11)
head.right.left.left = Node(12)
a = CompleteTreeNodeNum(head)
print(a)
当当前节点的右子树最左的节点到达最后一层,则左子树是满的,递归右子树
没到最后一层,右子树是满的,递归左子树