代码随想录学习Day 14

104.二叉树的最大深度

题目链接

讲解链接

本题很容易想到采用层次遍历的思路来解决,因为要求的是二叉树的最大深度,那么在进行层次遍历的时候设置一个变量count用来记录当前遍历的层数,count初始为0,每遍历完一层将其值+1,最后返回该值即为二叉树的最大深度。

python 复制代码
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        count = 0
        queue = deque([root])
        # 与层次遍历的代码基本一致,只需要在每次for循环结束后将count+1即可
        while queue:
            for _ in range(len(queue)):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            count += 1
        return count

559.n叉树的最大深度

题目链接

思路与二叉树基本一致,仅需把左右孩子改为children即可。

python 复制代码
class Solution:
    def maxDepth(self, root: 'Node') -> int:
        if not root:
            return 0
        count = 0
        queue = deque([root])
        while queue:
            for _ in range(len(queue)):
                node = queue.popleft()
                for child in node.children:  # 仅需修改此处
                    queue.append(child)
            count += 1
        return count

111.二叉树的最小深度

题目链接

讲解链接

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 本题首先想到的就是采用层次遍历的做法,每遍历一层深度+1,当遇到第一个**叶子结点(左右孩子都为空的结点)**时,返回当前的深度即可。迭代法层序遍历的代码如下:

python 复制代码
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:  # 若根结点为空则深度为0
            return 0
        queue = deque([root])
        depth = 1  # 深度初始值为1
        while queue:  # 层次遍历
            for _ in range(len(queue)):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
                if not node.left and not node.right:  # 若左右孩子都为空,则说明是叶子结点,直接返回当前深度
                    return depth
            depth += 1  # 每次for循环结束相当于遍历完了一层,对深度+1

如果考虑使用递归法,则需要使用前序或后序遍历。本题采用递归法后序遍历实现。求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。

先求左子树深度,再求右子树深度,最后遍历中间根节点给高度加上1。体现了后序遍历的逻辑。

python 复制代码
class Solution:
    def getDepth(self, node):
        if node is None:
            return 0
        leftDepth = self.getDepth(node.left)  # 左子树最小深度
        rightDepth = self.getDepth(node.right)  # 右子树最小深度
        # 当一个左子树为空,右不为空,这时并不是最低点
        if node.left is None and node.right is not None:
            return 1 + rightDepth        
        # 当一个右子树为空,左不为空,这时并不是最低点
        if node.left is not None and node.right is None:
            return 1 + leftDepth        
        result = 1 + min(leftDepth, rightDepth)  # 左右都不为空,则返回左右子树中高度最小的一棵的深度+1
        return result
    def minDepth(self, root):
        return self.getDepth(root)

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

题目链接

讲解链接

本题同上面几题类似,采用层序遍历的思想来做很容易解决。仅需在遍历每一层是记录一下当前层的结点个数即可,最后返回所有层结点个数的总和。

python 复制代码
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        queue = deque([root])
        count = 0
        while queue:
            count += len(queue)  # count加上当前层的结点个数
            for _ in range(len(queue)):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return count
                

但本题考查的是求完全二叉树的节点个数,所以可以利用完全二叉树的特性。在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。

python 复制代码
class Solution:
    def countNodes(self, root: TreeNode) -> int:
        if not root:
            return 0
        left = root.left
        right = root.right
        leftDepth = 0  # 这里初始为0是为了下面求指数方便
        rightDepth = 0
        while left:  # 求左子树深度
            left = left.left
            leftDepth += 1
        while right:  # 求右子树深度
            right = right.right
            rightDepth += 1
        if leftDepth == rightDepth:
            return (2 << leftDepth) - 1  # 注意(2<<1) 相当于2^2,所以leftDepth初始为0
        return self.countNodes(root.left) + self.countNodes(root.right) + 1
相关推荐
西岸行者13 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意13 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码13 天前
嵌入式学习路线
学习
毛小茛13 天前
计算机系统概论——校验码
学习
babe小鑫13 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms13 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下13 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。13 天前
2026.2.25监控学习
学习
im_AMBER13 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J13 天前
从“Hello World“ 开始 C++
c语言·c++·学习