LeetCode617. 合并二叉树

1. 题目描述

题目来源:力扣

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

图1. 二叉树融合示例

2. 题解

解题思路:

根据题意,从两颗树的根节点开始,如果当前位置两棵树都有节点,那么就节点相加,否则,保留有节点的值。那么该节点的左子树仍为当前两个节点的左子树融合;当前的右子树仍为当前两个节点的右子树融合,直到两个节点的左右子树都是空为止。根据该分析,使用递归求解。算法如下,

(1)初始化root为当前两个根节点之和,若其中一个节点为空,则保留另外一个节点;

(2)若当前节点有左子树,当前节点的左子树为左子树递归调用该函数的结果;

(3)若当前节点有右子树,当前节点的右子树为右子树递归调用该函数的结果;

直到左右子树都为空为止,返回结果。

代码如下,

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def mergeTrees(self, root1, root2):
        """
        :type root1: TreeNode
        :type root2: TreeNode
        :rtype: TreeNode
        """
        if root1 != None and root2 != None:
            root = TreeNode(root1.val + root2.val)
            if root1.left != None and root2.left != None:
                root.left = self.mergeTrees(root1.left, root2.left)
            elif root1.left != None:
                root.left = self.mergeTrees(root1.left, None)
            elif root2.left != None:
                root.left = self.mergeTrees(None, root2.left)

            if root1.right != None and root2.right != None:
                root.right = self.mergeTrees(root1.right, root2.right)
            elif root1.right != None:
                root.right = self.mergeTrees(root1.right, None)
            elif root2.right != None:
                root.right = self.mergeTrees(None, root2.right)
        elif root1 != None:
            root = TreeNode(root1.val)
            if root1.left != None:
                root.left = self.mergeTrees(root1.left, None)

            if root1.right != None:
                root.right = self.mergeTrees(root1.right, None)
        elif root2 != None:
            root = TreeNode(root2.val)
            if root2.left != None:
                root.left = self.mergeTrees(None, root2.left)

            if root2.right != None:
                root.right = self.mergeTrees(None, root2.right)
        else:
            return 

        return root

其中一个细节需要注意,即当root1和root2有一个为None时,判断左右子树是否存在时应注意None没有左右子树,无从判断;和root1和root2都非空时的情况不太一致,考虑的情况更少,仅需判断当前非空节点是否有左右子树即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值