求职刷题 力扣 day16 ---二叉树part03

今天的三道题,涉及:

  1. 二叉树的层序遍历、深度遍历、层序遍历的迭代实现
  2. 完全二叉树、满二叉树(如何判断一颗树是否是满二叉树、如何计算满二叉树的节点数)

1. 04.二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7],
在这里插入图片描述

代码实现:

  1. 深度遍历
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:return 0
        return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
  1. 层序遍历
  2. 深度遍历的栈实现

2. 111.二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。
在这里插入图片描述

python代码实现

  1. 深度遍历
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        # 深度优先搜索,根、左右/根、右左都行
        if not root: return 0
        if not root.right:
            return self.minDepth(root.left) + 1
        if not root.left:
            return self.minDepth(root.right) + 1
        return min(self.minDepth(root.left), self.minDepth(root.right)) + 1
  1. 层序遍历
from collections import deque
# 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 not root:return 0
        queue = deque()
        queue.append(root)
        depth = 0
        while queue:
            for i in range(len(queue)):
                root = queue.popleft()
                depth += 1
                if not root.left and not root.right:
                    return depth
                if root.left:
                    queue.append(root.left)
                if root.right:
                    queue.append(root.right) 
        return depth
  1. 深度遍历的栈实现

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

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
在这里插入图片描述

代码实现

两种实现方法:

  1. 非完全二叉树的实现
  2. 针对完全二叉树的实现
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root: return 0
        # 注释的代码是针对判断是否是满二叉树的代码,如果是满二叉树,则直接根据公式计算子树
        # 的节点数
        
        # left_depth, right_depth = 0, 0
        # node = root
        # while node.left:
        #     node = node.left
        #     left_depth += 1
        # while node.right:
        #     node = node.right
        #     right_depth += 1
        # if left_depth == right_depth:
        #     return 2 ** (left_depth + 1) - 1
        return self.countNodes(root.left) + self.countNodes(root.right) + 1
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云墨丹青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值