当前位置: 首页 > article >正文

leetcode_深度搜索和广度搜索 116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针

  • 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。
  • 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
  • 初始状态下,所有 next 指针都被设置为 NULL。
  • 思路:
    • 对于完美二叉树,可以利用每一层的节点之间的连接关系:其左子节点的 next 应该指向右子节点,右子节点的 next 指向它的兄弟节点的 next(如果有的话)。由于每个节点都有两个子节点,并且二叉树是完美的(即所有叶子节点都在同一层),得出以下步骤:

      1. 从树的根节点开始,逐层处理。由于根节点的本身没有右侧节点,且next初始值为none,故不用单独处理
      2. 遍历当前层数的每一个节点
      3. 对于每一个节点,如果它有左子节点,则把左子节点的 next 指针指向右子节点(level_node.left.next = level_node.right);如果它有右子节点,则把右子节点的 next 指针指向当前节点的 next 的左子节点(level_node.right.next = level_node.next.left)
      4. 在完成当前层的连接后,进入下一层(cur = cur.left)
# Definition for a Node.
class Node(object):
    def __init__(self, val=0, left=None, right=None, next=None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next

"""

class Solution(object):
    def connect(self, root):
        """
        :type root: Node
        :rtype: Node
        """
        if not root:
            return None
        
        # 从根节点开始处理
        cur = root
        
        # 每一层的遍历
        while cur:
            # 遍历当前层的每个节点
            level_node = cur
            while level_node:
                # 连接左子节点和右子节点
                if level_node.left:
                    level_node.left.next = level_node.right
                
                # 连接右子节点和当前节点的下一个节点的左子节点
                if level_node.right and level_node.next:
                    level_node.right.next = level_node.next.left
                
                # 移动到下一节点
                level_node = level_node.next
            
            # 处理下一层,当前层的最左节点就是下一层的根
            cur = cur.left
        
        return root
  • 时间复杂度: O(n), n为节点个数
  • 空间复杂度: O(1)

http://www.kler.cn/a/543223.html

相关文章:

  • idea插件开发,如何获取idea设置的系统语言
  • C#/.NET/.NET Core技术前沿周刊 | 第 24 期(2025年1.27-1.31)
  • 网络安全工程师逆元计算 网络安全逆向
  • AJAX XML技术详解
  • 网络工程师 (31)VLAN
  • vi 是 Unix 和 Linux 系统中常用的文本编辑器
  • C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现
  • 笔试题笔记#3
  • PyTorch Lightning Trainer介绍
  • Spring 核心技术解析【纯干货版】- XII:Spring 数据访问模块 Spring-R2dbc 模块精讲
  • 如何在WinForms应用程序中读取和写入App.config文件
  • 记忆模块概述
  • 用AI做算法题1
  • 深度学习-111-大语言模型LLM之基于langchain的结构化输出功能实现文本分类
  • 网络工程师 (33)VLAN注册协议——GVRP协议
  • linux 内核结构基础
  • MFC程序设计(十二)绘图
  • 建筑兔零基础自学python记录18|实战人脸识别项目——视频检测07
  • EPL 4.01 Preview
  • 【Elasticsearch】文本分析Text analysis概述
  • 【鸿蒙开发】第二十九章 Stage模型-应用上下文Context、进程、线程
  • Unity 代码优化记录
  • 【c++】shared_ptr是线程安全的吗?
  • fun-transformer学习笔记-Task1——Transformer、Seq2Seq、Encoder-Decoder、Attention之间的关系
  • vivo手机和Windows电脑连接同一个WiFi即可投屏!
  • Spring Cloud 完整引解:优化你的微服务架构