力扣每日练习(3.19)补

958. 二叉树的完全性检验

根据完全的定义,可以知道是最后一层的节点要尽可能靠近左边,那么不成立的条件就是最后一层的节点是这样的[1,4,56,null,13]
也就是第一个空节点后竟然还有非空节点,违背了完全。

所以采用层序遍历的方式,将每层的节点都检查是否null是连续的。这样不仅考虑了最后一层的情况,还考虑到了中间层有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 isCompleteTree(self, root: Optional[TreeNode]) -> bool:

        # 层序遍历
        queue = [root]
        # 初始化标记
        is_empty = False

        while queue:
            level_size = len(queue)
    
            for _ in range(level_size):
                # 检查每个节点
                node = queue.pop(0)
                # 节点为空,则将指示变量设为True
                if node is None:
                    is_empty = True
                else: # 否则,检查指示变量是否为True,如果是,则代表前面有空节点,不是完全了
                    if is_empty: return False
                    # 不为空,继续检查左右子树,空的也要加
                    queue.append(node.left)
                    queue.append(node.right)

        return is_empty

543. 二叉树的直径

二叉树的直径不一定通过根节点,它可以是:
经过根节点的最长路径,这条路径由根节点的左子树的最大深度和右子树的最大深度组成。
完全位于左子树内的最长路径。
完全位于右子树内的最长路径。

因此,对于每个节点,我们需要计算两部分:
经过该节点的最长路径长度(这不是直径,除非该节点恰好是直径的根节点)。这等于该节点左子树的深度加上右子树的深度。
该节点子树的深度,以便于父节点计算经过自身的最长路径长度。

# 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 diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        
        self.diameter = 0
        
        def depth(node):
            if not node:
                return 0
            left_depth = depth(node.left)  # 计算左子树的深度
            right_depth = depth(node.right)  # 计算右子树的深度
            
            # 更新直径
            self.diameter = max(self.diameter, left_depth + right_depth)
            
            # 返回节点的深度
            return max(left_depth, right_depth) + 1
        
        depth(root)  # 从根节点开始递归
        return self.diameter

662. 二叉树最大宽度

最大宽度,中间如果是空也记上。很自然想到层序遍历,但是最大宽度不能像层序那样只记录非空节点,所以要引入索引

可以将其视为一个满二叉树,其性质就是

在一个完全二叉树(或任意二叉树,但我们用完全二叉树的性质来帮助我们进行计算)中,如果我们假设根节点的索引为0,则对于任意一个节点,其左子节点的索引为2 * index + 1,其右子节点的索引为2 * index + 2,其中index是该节点的索引。

所以就根据其索引,遇到非空的节点的左右子树,直接在队列中增加其节点和索引。

# 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 widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:

        if not root: return 0

        max_width = 0
        queue = [(root, 0)]  # 队列中存储(节点,索引)

        while queue:
            level_size = len(queue)
            _, first_index = queue[0]  # 当前层第一个节点的索引
            _, last_index = queue[-1]  # 当前层最后一个节点的索引
            max_width = max(max_width, last_index - first_index + 1)

            for _ in range(level_size):
                node, index = queue.pop(0)
                # 利用满二叉树的性质
                if node.left:
                    queue.append((node.left, index * 2 +1))
                if node.right:
                    queue.append((node.right, index * 2 +2))
            
        return max_width

相关推荐

  1. 每日练习(3.15)

    2024-03-21 08:10:04       45 阅读
  2. 每日练习(3.16)

    2024-03-21 08:10:04       42 阅读
  3. 每日练习(3.19)

    2024-03-21 08:10:04       44 阅读
  4. 每日练习(3.20)

    2024-03-21 08:10:04       42 阅读
  5. 每日练习3.12

    2024-03-21 08:10:04       40 阅读
  6. 每日练习3.14

    2024-03-21 08:10:04       39 阅读
  7. 每日练习(3.26)

    2024-03-21 08:10:04       41 阅读
  8. 算法练习----每日一题------1

    2024-03-21 08:10:04       48 阅读
  9. 算法练习----每日一题------2

    2024-03-21 08:10:04       29 阅读
  10. 算法练习----每日一题------3

    2024-03-21 08:10:04       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 08:10:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 08:10:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 08:10:04       82 阅读
  4. Python语言-面向对象

    2024-03-21 08:10:04       91 阅读

热门阅读

  1. 插件电感的工艺结构原理及选型参数总结

    2024-03-21 08:10:04       39 阅读
  2. React.js入门级教程附带代码详解

    2024-03-21 08:10:04       34 阅读
  3. Spark面试整理-Spark的主要组件是什么?

    2024-03-21 08:10:04       40 阅读
  4. 2024最新华为OD机试试题库全 -【转盘寿司】- C卷

    2024-03-21 08:10:04       32 阅读
  5. 安卓面试题多线程 66-70

    2024-03-21 08:10:04       34 阅读
  6. 【开发方案】Android 应用双卡搜网功能

    2024-03-21 08:10:04       45 阅读
  7. 【Python基础】collections.Counter()

    2024-03-21 08:10:04       46 阅读
  8. 请求为blob,但是返回json格式,如何处理

    2024-03-21 08:10:04       37 阅读