Given a complete binary tree, count the number of nodes.
Note:
Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.
Example:
Input:
1
/
2 3
/ /
4 5 6
Output: 6
Solution1:(TLE)
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root is None:
return 0
return 1+self.countNodes(root.left)+self.countNodes(root.right)
Solution2:(TLE) why!
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root is None:
return 0
def leftheight(root):
count = 0
while root:
count += 1
root = root.left
return count
def rightheight(root):
count = 0
while root:
count += 1
root = root.right
l = leftheight(root)
r = rightheight(root)
if l==r:
return 2**l-1
return 1 + self.countNodes(root.left) + self.countNodes(root.right)
Solution3:
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if self.countLeft(root) == self.countRight(root):
return (1<<self.countLeft(root)) - 1
else:
return self.countNodes(root.left) + self.countNodes(root.right) + 1
def countLeft(self, root):
ans = 0
while root:
ans += 1
root = root.left
return ans
def countRight(self, root):
ans = 0
while root:
ans += 1
root = root.right
return ans