222. 完全二叉树的节点个数
原始题目链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例 2:
输入:root = []
输出:0
示例 3:
输入:root = [1]
输出:1
解题思路:
理解完全二叉树的特点:完全二叉树的性质:左子树的深度是大于等于右子树的深度,当左子树的深度 == 右子树的深度,则左子树是一颗满二叉树;当左子树的深度 > 右子树的深度,则右子树是一颗满二叉树。满二叉树的节点个数等于:2的子树深度次幂 - 1,所以不是满二叉树的那棵子树就递归的调用主函数去往上计算节点的个数,因为往上递归,其左右子树也满足上面说明的计算方法,其中有一棵子树一定是满二叉树,一直追溯到根上。
代码实现:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def countNodes(self, root: TreeNode) -> int:
# 计算树的深度
def calc_root_deep(root):
deep = 0
while root:
deep += 1
root = root.left
return deep
# 完全二叉树的性质:左子树的深度是大于等于右子树的深度
# 1.当左子树的深度 == 右子树的深度,则左子树是一颗满二叉树
# 2.当左子树的深度 > 右子树的深度,则右子树是一颗满二叉树
# 满二叉树的节点个数等于:2的子树深度次幂 - 1
# 空树
if root == None:
return 0
# 计算左右子树的深度
left_deep = calc_root_deep(root.left)
right_deep = calc_root_deep(root.right)
# 1的情况
if left_deep == right_deep:
return (2 ** left_deep - 1) + self.countNodes(root.right) + 1
# 2的情况
if left_deep > right_deep:
return (2 ** right_deep - 1) + self.countNodes(root.left) + 1
参考文献:
https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/acm-xuan-shou-tu-jie-leetcode-by-rocky04-5epi/