给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
第一种思路:
按照处理树相关问题的经验,
先处理根节点,再递归地处理左右子树。
# 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
return 1 + self.countNodes(root.left) + self.countNodes(root.right)
第二种思路:
随便一种遍历方法统计即可,中序前序后序层序。
class Solution(object):
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.res = []
def inorder(node):
if not node:
return
inorder(node.left)
self.res.append(node.val)
inorder(node.right)
inorder(root)
return len(self.res)
第三种思路:
先找出多少层,再找出来最后一层有几个。
没有实现……
class Solution(object):
def countNodes(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
self.leavesCnt = 0 # 最深一层叶节点个数
self.height = 0 # 树的高度
self.flag = 0 # flag为1则终止查找
def dfs(node, layer):
if not node or self.flag:
return
if not node.left and not node.right: # 找到一个叶子节点
self.height = max(self.height, layer)
if layer < self.height: # 找到一个非最后一层的叶节点,说明查找可以结束
self.flag = 1
else:
self.leavesCnt += 1
return
dfs(node.left, layer + 1)
dfs(node.right, layer + 1)
dfs(root, 0)
return self.leavesCnt + sum([2 ** i for i in range(self.height)] )