求解完全二叉树的节点总数 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

 

转载于:https://www.cnblogs.com/icekx/p/9131786.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值