algorithm - 有人能解释一下如何合并两个二叉树吗?

标签 algorithm recursion data-structures tree binary-search-tree

给定两棵二叉树,想象一下,当您将其中一棵树覆盖在另一棵树上时,两棵树的某些节点重叠而其他节点不重叠。

你需要将它们合并成一个新的二叉树。合并规则是,如果两个节点重叠,则将节点值相加作为合并节点的新值。否则,NOT null节点将被用作新树的节点。

输入:

Tree 1                     Tree 2                  
      1                         2                             
     / \                       / \                            
    3   2                     1   3                        
   /                           \   \                      
  5                             4   7                  

输出: 合并树:

     3
    / \
   4   5
  / \   \ 
 5   4   7



public class Solution {
    public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
        if (t1 == null)
            return t2;
        if (t2 == null)
            return t1;
        t1.val += t2.val;
        t1.left = mergeTrees(t1.left, t2.left);
        t1.right = mergeTrees(t1.right, t2.right);
        return t1;
    }
}

问这个算法是如何工作的可能有点天真?一旦我们返回这个 t2 或 t1,它就会返回另一个 TreeNode,因此从技术上讲,方法应该停止执行。不是吗?帮帮我

最佳答案

如果您注意这一行:t1.val += t2.val;,您可以看出我们实际上是在将树 2 合并到树 1。我们并没有创建新树/节点。

另请注意,我们始终在函数 mergeTrees() 中传递两棵树的相应节点。如果两个节点都非空,我们将 t2 的值添加到 t1。如果其中任何一个为空,那么根据规则,我们必须保留另一个节点(可以是非空或空)。

只有当我们处理了当前节点的左右子树(如果有的话)时,我们才返回 t2t1。此返回值成为先前调用mergeTrees()t1 节点的子节点

例子:

Tree 1:
  a (single node)

Tree 2:
  b
 /
c

第一个函数调用 - mergeTrees(a, b):

  • 这里两个节点 ab 都是非空的。所以我们做 a.val += b.val
  • 现在,a.left 将被分配给第二个函数调用返回的节点 - mergeTrees(a.left, b.left)

所以我们进行第二次函数调用 - mergeTrees(null, c):

  • 这里的第一个节点是空的。所以我们简单地返回另一个节点 c

现在,控制权回到第一个调用:

  • a.left = c
  • 我们必须将 a.right 分配给第三个函数调用返回的节点 - mergeTrees(a.right, b.right)

是时候进行第 3 次函数调用了 - mergeTrees(null, null):

  • 这里的第一个节点是 NULL。我们返回第二个节点,它也是 null

控制回到第一次调用:

  • a.right = NULL
  • 我们已经处理了左右子树。返回 a

调用者现在收到合并树的根 a,现在看起来像这样:

Merged Tree:

  a
 /
c

请注意,节点 a 现在存储值 a.val + b.val

关于algorithm - 有人能解释一下如何合并两个二叉树吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57145677/

相关文章:

使我的浏览器变慢的 Javascript 代码

java - 为什么这个字符串连接算法需要这么多步骤?

recursion - 如何将递归函数的值返回到数组

python - 在字典列表中查找最大值

"Blob"边界的算法

python - 在Python中迭代地对左括号和右括号之间的值进行排序

javascript - 为什么函数返回未定义?

C++ 返回 vector

javascript - 如何将数据分组并存储到具有特定键的数组中

python - 有效生成老虎机结果