这道题用递归的思想,如果一棵全满的树,只要知道它的高度就能够计算出它节点的个数(1<<0 + 1<<1 + 1<<2... + 1<<height)。
因此,对于给定的不完全二叉树,检查根节点的左子树是否全满(这里通过两个指针,一个指针沿着左孩子一路向下,一个指针沿着右孩子一路向下,当沿着右孩子的指针为空时,查看沿着左孩子的指针是否为空)
如果左子树全满,则节点数量 = 左子树节点数量(公式计算) + 1 + 右子树节点数量(递归)
如果左子树不是全满,此时,右子树高度 = 左子树高度 - 1,且右子树一定全满,节点数量 = 右子树节点数量(公式计算) + 1 + 左子树节点数量(递归)
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
if not root.left:
return 1
# 查看左子树是否满
point1, point2 = root.left, root.left
height = 0
count = 0
while True:
count += 1 << height
point1 = point1.left
point2 = point2.right
if not point2:
break
height += 1
if not point1:
# 左子树全满
return 1 + count + self.countNodes(root.right)
else:
# 左子树不满
# 此时右子树高度 = 左子树 - 1
# 右子树全满
return 1 + count + self.countNodes(root.left)