代码随想录算法训练营第十六天| 104. 二叉树的最大深度、111. 二叉树的最小深度、222. 完全二叉树的节点个数

文章详细介绍了如何使用递归方法计算二叉树的最大深度、最小深度以及完全二叉树的节点个数。对于最大深度,通过比较左右子树的深度得到;最小深度则是找到左右子树的最小值;而计算完全二叉树的节点数量利用了层次遍历的方法。
摘要由CSDN通过智能技术生成

104. 二叉树的最大深度:


代码思路

递归套路:要计算这个树的最深深度,则是右子树的最深深度或者左子树的最深深度的较大值。
也就是max(右子树最深深度,左子树最深深度)。
也就是每个递归函数都要返回一个局部最深深度depth。即left_depth = depth(node.left),right_depth = depth(node.right)。
而其实该树的最深深度其实就是max(left_depth, right_depth)。
然后再看叶子节点,叶子节点返回啥呢?叶子节点的左右节点都是空节点,当递归遇到空节点时,肯定是返回一个数值!!而不是返回空。返回的数值就是叶子节点的深度啦。
在函数的参数里面记录当前层的层数。

# 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 maxDepth(self, root: Optional[TreeNode]) -> int:
        def find_max(node, layer):
            if node == None:
                return layer - 1
            left_depth = find_max(node.left, layer+1)
            right_depth = find_max(node.right, layer + 1)
            return max(left_depth, right_depth)
        return find_max(root, 1)

111. 二叉树的最小深度:


递归老套路:要知道这棵树的最小深度,则肯定是左子树的最小深度和右子树的最小深度之间的最小值。也就是min(左子树的最小深度, 右子树的最小深度)。
然后左子树的最小深度=find_min(node.left)
右子树的最小深度=find_min(node.right)
再看叶子节点, 这里需要注意,叶子节点的定义是左右子节点均为空才算
所以终止条件要node.left 和 node.right都要是null才可以.

代码思路

# 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 minDepth(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return 0
        def find_min(node, layer):
            if node.left == None and node.right == None:
                return layer
            if node.left == None and node.right != None:
                return find_min(node.right, layer+1)
            if node.left != None and node.right == None:
                return find_min(node.left, layer+1)
            left_depth = find_min(node.left, layer+1)
            right_depth = find_min(node.right, layer+1)
            return min(left_depth, right_depth)
        return find_min(root, 1)                    
        return mindepth(root, 1)

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


代码思路

# 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: Optional[TreeNode]) -> int:
        if root == None:
            return 0
        def bfs(node, layer):
            if node != None and node.left == None and node.right == None:
                return layer, 1
            elif node == None:
                return layer, 0
            else:
                if node.left == None:
                    return layer + 1, 1
                elif node.right == None:
                    return layer + 1, 1
                else:
                    layer1, bottom_nums1 = bfs(node.left, layer + 1)
                    layer2, bottom_nums2 = bfs(node.right, layer + 1)
                    if layer1 > layer2:
                        return layer1, bottom_nums1
                    elif layer1 < layer2:
                        return layer2, bottom_nums2
                    else:
                        return layer1, bottom_nums1 + bottom_nums2
        layers, bottom_num = bfs(root, 1)
        return 2 ** (layers-1) - 1 + bottom_num 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值