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

python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树

相关推荐
python coding with ChatGPT 打卡第12天| 二叉树:理论基础
python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历
python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历
python coding with ChatGPT 打卡第15天| 二叉树:翻转二叉树、对称二叉树
python coding with ChatGPT 打卡第16天| 二叉树:完全二叉树、平衡二叉树、二叉树的所有路径、左叶子之和
python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和
python coding with ChatGPT 打卡第18天| 二叉树:从中序与后序遍历序列构造二叉树、最大二叉树

合并二叉树

Key Points

将直接在 root1 上就地合并 root2,以避免额外的空间复杂度

相关题目

617. 合并二叉树

视频讲解

一起操作两个二叉树

重点分析

方法一:
递归(修改root1)

class Solution:
    def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:
        # 递归终止条件: 
        #  但凡有一个节点为空, 就立刻返回另外一个. 如果另外一个也为None就直接返回None. 
        if not root1: 
            return root2
        if not root2: 
            return root1
        # 上面的递归终止条件保证了代码执行到这里root1, root2都非空. 
        root1.val += root2.val # 中
        root1.left = self.mergeTrees(root1.left, root2.left) #左
        root1.right = self.mergeTrees(root1.right, root2.right) # 右
        
        return root1 # ⚠️ 注意: 本题我们重复使用了题目给出的节点而不是创建新节点. 节省时间, 空间. 

方法二:
递归(创建新节点)

def mergeTrees(root1, root2):
    if not root1:
        return root2
    if not root2:
        return root1
    root = TreeNode(root1.val + root2.val)
    root.left = mergeTrees(root1.left, root2.left)
    root.right = mergeTrees(root1.right, root2.right)
    return root

方法三:
迭代法(修改root1)

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def mergeTrees(root1, root2):
    if not root1:
        return root2
    if not root2:
        return root1
    
    # 使用队列存储需要合并的节点对
    queue = [(root1, root2)]
    while queue:
        node1, node2 = queue.pop(0)
        
        # 如果两个节点都不为 None,则合并它们的值
        if node1 is not None and node2 is not None:
            node1.val += node2.val
            
            # 如果 node1 的左子节点为空,我们直接将 node2 的左子节点链接过来
            if not node1.left:
                node1.left = node2.left
            else:
                queue.append((node1.left, node2.left))
            
            # 对于右子节点执行相同的操作
            if not node1.right:
                node1.right = node2.right
            else:
                queue.append((node1.right, node2.right))
                
    return root1

方法四:
迭代法(新建节点)

def mergeTrees(root1, root2):
    if not root1 and not root2:
        return None
    elif not root1:
        return TreeNode(root2.val, root2.left, root2.right)
    elif not root2:
        return TreeNode(root1.val, root1.left, root1.right)
    else:
        # 创建一个新节点,值为两个节点值的和
        newNode = TreeNode(root1.val + root2.val)
        
        # 使用队列存储节点对,以并行遍历两棵树
        queue = [(root1, root2, newNode)]
        
        while queue:
            node1, node2, new_node = queue.pop(0)
            
            # 处理左子节点
            if node1.left or node2.left:
                if node1.left and node2.left:
                    new_node.left = TreeNode(node1.left.val + node2.left.val)
                    queue.append((node1.left, node2.left, new_node.left))
                elif node1.left:
                    new_node.left = TreeNode(node1.left.val, node1.left.left, node1.left.right)
                else:  # node2.left
                    new_node.left = TreeNode(node2.left.val, node2.left.left, node2.left.right)
            
            # 处理右子节点
            if node1.right or node2.right:
                if node1.right and node2.right:
                    new_node.right = TreeNode(node1.right.val + node2.right.val)
                    queue.append((node1.right, node2.right, new_node.right))
                elif node1.right:
                    new_node.right = TreeNode(node1.right.val, node1.right.left, node1.right.right)
                else:  # node2.right
                    new_node.right = TreeNode(node2.right.val, node2.right.left, node2.right.right)
                    
        return newNode

在这里插入图片描述


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

相关文章:

  • STM32设计学生宿舍监测控制系统
  • 「QT」窗口类 之 QWidget 窗口基类
  • python——面向对象
  • change buffer:到底应该选择普通索引还是唯一索引
  • Java面向对象编程进阶之包装类
  • 车-路-站-网”信息耦合的汽车有序充电
  • 显示器校准软件:BetterDisplay Pro for Mac v2.0.11激活版下载
  • 读书笔记之《运动改造大脑》:运动是最佳的健脑丸
  • 【大厂AI课学习笔记】【1.6 人工智能基础知识】(1)人工智能、机器学习、深度学习之间的关系
  • 二、数据结构
  • golang 集成sentry:http.Client
  • 【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Viterbi译码原理
  • GPT-4登场:多模态能力革新,提升ChatGPT与必应体验,开放API助力游戏革新
  • ZooKeeper分布式锁
  • 【golang】23、gorilla websocket 源码:examples、数据结构、流程
  • 【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
  • Linux满载CPU和运行内存的方法
  • 中文点选识别
  • c#安全-nativeAOT
  • 【java】Hibernate访问数据库
  • 快团团大团长加了微信都不回复怎么回事?如果自己做快团团预算需要多少,团队需要几个人
  • Java 将TXT文本文件转换为PDF文件
  • 前端-Vue項目初始化
  • AJAX——认识URL
  • 灰度发布浅见
  • Flink-CDC实时读Postgresql数据