222. 完全二叉树的节点个数

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值