第一反应是没读懂题,因为会想到不是从上到下,从左到右遍历所有节点,save在list里,再用len()计算长度即可如下(但是时间复杂度貌似不符合):
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
#
# @param head TreeNode类
# @return int整型
#
class Solution:
def nodeNum(self , head ):
# write code here
if head == None:
return 0
queue = [head]
res = []
while queue:
node = queue.pop(0)
res.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return len(res)
或者更简单的方式是递归:
class Solution:
def nodeNum(self , head ):
# write code here
# 特殊情况
if not head:
return 0
return self.nodeNum(head.left) + self.nodeNum(head.right) + 1
但是其实也是遍历,其实不算优化算法,
优化算法有,但是一般可能不怎么想得到: 满二叉树是完全二叉树的一个特例, 如果是一个满2叉树 , 则套用公式 , 2的树深次方-1
如果是满二叉树,再加上剩下的节点 class Solution:
def nodeNum(self , head ):
# write code here
# 特殊情况
if not head:
return 0
num_l = self.depth(head.left)
num_r = self.depth(head.right)
if num_l == num_r:
return 2**num_l -1 + 1 + self.nodeNum(head.right)
else:
return 2**num_r -1 + 1 + self.nodeNum(head.left)
def depth(self, root):
cnt = 0
while root != None:
cnt += 1
root = root.left
return cnt