求解完全二叉树的节点总数 Python实现

1.利用一般递归即可求得

1 def getNodeNums(head):
2     if not head:
3         return 0
4     lnums = getNodeNums(head.left)
5     rnums = getNodeNums(head.right)
6     return lnums + rnums + 1

2.利用完全二叉树的特性递归(时间复杂度O(logn*logn))

 1 # 利用完全二叉树特性,使用递归 时间复杂度:O(logn*logn)
 2 # 满二叉树节点总个数为2**n-1
 3 def nodeNums(head):
 4     if not head:
 5         return 0
 6     return bs(head, 1, mostLeftLevel(head, 1)) 
 7 
 8 # 求当前节点的节点总数
 9 def bs(node, level, height):
10     if level == height:
11         return 1
12         # 如果当前节点的右子节点等于父节点深度减一,即当前节点的左子树为满二叉树
13     if mostLeftLevel(node.right, level+1) == height: 
14         # 返回左子树节点数+父节点+右子树节点数                    
15         return 2**(height-level) + bs(node.right, level+1, height)     
16     else:       
17         # 如果右子节点深度不等于父节点深度减一,又此树为完全二叉树,即右子树为满二叉树  
18         # 返回右子树节点数+父节点+左子树节点数
19         return 2**(height-level-1) + bs(node.left, level+1, height)     
20 
21 # 根据完全二叉树特征求当前节点的深度
22 def mostLeftLevel(node, level):        
23     while node:
24         level += 1
25         node = node.left
26     return level - 1

 

posted @ 2018-06-04 09:34  icekx  阅读(1868)  评论(0编辑  收藏  举报