zoukankan      html  css  js  c++  java
  • 求解完全二叉树的节点总数 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
  • 相关阅读:
    JAVA读取properties
    nginx默认语法
    csp-s模拟45
    csp-s模拟44
    noip模拟测试42
    noip模拟测试40
    noip模拟测试21
    noip模拟测试20
    noip模拟测试19
    noip模拟测试18
  • 原文地址:https://www.cnblogs.com/icekx/p/9131786.html
Copyright © 2011-2022 走看看