题解 | 合并二叉树

合并二叉树

https://www.nowcoder.com/practice/7298353c24cc42e3bd5f0e0bd3d1d759

合并二叉树的核心思想是同时遍历两棵树的对应节点,若节点都存在则值相加,否则直接取非空节点作为结果。该操作可通过递归或迭代实现。

(一)递归法(前序遍历)

步骤:

1、终止条件: 若 t1 为空,返回 t2; 若 t2 为空,返回 t1。

2、处理当前节点: 将 t1.val += t2.val。

3、递归处理左右子树: t1.left = mergeTrees(t1.left, t2.left)

t1.right = mergeTrees(t1.right, t2.right)

4、返回合并后的 root1。

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param t1 TreeNode类 
# @param t2 TreeNode类 
# @return TreeNode类
#
class Solution:
    def mergeTrees(self , t1: TreeNode, t2: TreeNode) -> TreeNode:
        # write code here DFS
        if not t1:
            return t2
        if not t2:
            return t1
        t1.val += t2.val
        t1.left = self.mergeTrees(t1.left,t2.left)
        t1.right = self.mergeTrees(t1.right,t2.right)
        return t1

该方法简洁高效,直接在原树上修改,节省空间。

(二)迭代法(队列层序遍历)

步骤:

1、若有一棵树为空,直接返回另一棵。

2、使用队列存储成对节点 (node1, node2)。

3、每次出队一对节点: 将 node1.val += node2.val。 若两者左子节点都存在,入队;否则若 node1.left 为空则赋值为 node2.left。 同理处理右子节点。

4、返回修改后的 root1。

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param t1 TreeNode类 
# @param t2 TreeNode类 
# @return TreeNode类
#
class Solution:
    def mergeTrees(self , t1: TreeNode, t2: TreeNode) -> TreeNode:
        # write code here BFS
        if not t1:
            return t2
        if not t2:
            return t1
        s = [(t1,t2)]
        while s:
            p = s.pop()
            p[0].val += p[1].val
            if p[0].left and p[1].left:
                s += [(p[0].left,p[1].left)]
            elif not p[0].left:
                p[0].left = p[1].left
            if p[0].right and p[1].right:
                s += [(p[0].right,p[1].right)]
            elif not p[0].right:
                p[0].right = p[1].right
        return t1

迭代法适合避免深递归导致的栈溢出。

建议:数据量小可用递归,数据量大或树深时推荐迭代。

全部评论

相关推荐

02-14 12:40
门头沟学院 Java
程序员花海:1.面试要求必须Java笔试不一定 2.难度对等秋招 远超于日常实习是因为同一批次且转正很多 竞争压力大 3.第一个加点指标,上线了就把接口性能加上去 使用本地缓存这个不算亮点 只是技术选型,要把为什么采用这个和背后的思考写出来而不是单纯堆叠技术没意义 4.八股要一直看 很容易忘记 5.拼团交易这个老问题 堆积技术 另外建议你把奖项合并到教育背景 没必要拆出来放最后
我的简历长这样
点赞 评论 收藏
分享
01-27 15:41
门头沟学院 Java
想躺平的菜鸡1枚:我项目比你难、学历比你好、还有SCI论文,投java都被拒一大片,现在基本上都要问点agent开发
软件开发投递记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务