📜  通过节点求和(递归和迭代)合并两个二叉树(1)

📅  最后修改于: 2023-12-03 15:28:27.799000             🧑  作者: Mango

通过节点求和(递归和迭代)合并两个二叉树

在二叉树中,我们可以通过节点的值进行求和。本篇文章将讨论如何通过递归和迭代的方式合并两个二叉树。

1. 问题描述

给定两个二叉树,在它们每个节点上添加值,并将它们合并为一个新的二叉树。合并规则是如果两个节点重叠,则将节点值加起来作为合并节点的新值。否则不重叠的节点将作为新节点添加到新树中。

2. 递归方式

递归合并两个二叉树的方式比较简单,我们可以遍历两个二叉树的节点,并递归合并它们。对于递归合并节点的函数,我们可以递归合并两个节点的左子树和右子树,并将它们的值相加作为新节点的值。

2.1 代码实现
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
    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
2.2 测试

调用 mergeTrees() 方法测试:

t1 = TreeNode(1, TreeNode(3, TreeNode(5)), TreeNode(2))
t2 = TreeNode(2, TreeNode(1, None, TreeNode(4)), TreeNode(3, None, TreeNode(7)))

result = mergeTrees(t1, t2)

# 遍历新二叉树

3. 迭代方式

迭代合并两个二叉树需要使用队列来实现。我们可以将节点存储在队列中,并在接下来的迭代中使用它们来创建新节点。

3.1 代码实现
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
    if not t1:
        return t2
    if not t2:
        return t1
    
    queue = []
    queue.append((t1, t2))
    
    while queue:
        t = queue.pop(0)
        
        if not t[0] or not t[1]:
            continue
        
        t[0].val += t[1].val
        
        if not t[0].left:
            t[0].left = t[1].left
        else:
            queue.append((t[0].left, t[1].left))
        
        if not t[0].right:
            t[0].right = t[1].right
        else:
            queue.append((t[0].right, t[1].right))
            
    return t1
3.2 测试

调用 mergeTrees() 方法测试:

t1 = TreeNode(1, TreeNode(3, TreeNode(5)), TreeNode(2))
t2 = TreeNode(2, TreeNode(1, None, TreeNode(4)), TreeNode(3, None, TreeNode(7)))

result = mergeTrees(t1, t2)

# 遍历新二叉树

4. 总结

本篇文章讨论了递归和迭代两种方式合并两个二叉树。和对比可以看出,递归方式比较简单直接,迭代方式则需要使用队列进行辅助。在实际应用中可以根据情况选择使用递归或者迭代的方式。