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
