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