当前位置: 首页 > 知识库问答 >
问题:

有人能解释一下两棵二叉树是如何合并的吗?

阎英朗
2023-03-14

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

您需要将它们合并到一个新的二叉树中。合并规则是,如果两个节点重叠,则将节点值加起来作为合并节点的新值。否则,非空节点将用作新树的节点。

输入:

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,所以从技术上讲,方法应该停止执行。不是吗?帮助我

共有3个答案

童冠玉
2023-03-14

这个算法

基本情况:节点t1、t2或两者均为空,因此该节点将被替换为其中之一(简单)

另一种情况更简单,这个算法首先访问节点,然后在这2棵树的左侧节点上进行递归,然后在右侧,所以它从顶部(根)开始,向下到左侧节点,当它到达最左侧的节点时,它会到达右侧节点,在并且您已经通过了树的所有节点。

只有t1被修改并返回,t2将被忽略。

https://imgur.com/NyDMFge

苍德寿
2023-03-14

mergeTrees仅当“另一个TreeNode”是唯一的TreeNode时返回“另一个TreeNode”(因为其中一个为空),这是有意义的,因为在该子树上没有什么可以做的。但你仍然需要回去工作;特别是,您需要将“另一个TreeNode”附加到它的新父节点,并创建尚未访问的子树。

东云
2023-03-14

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

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

只有在处理了当前节点的左右子树(如果有的话)之后,我们才会返回t2t1。此返回值成为上一次调用mergeTrees()t1节点的子节点。

例子:

Tree 1:
  a (single node)

Tree 2:
  b
 /
c

第一个函数调用-合并树(a,b)

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

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

  • 这里的第一个节点为空。因此,我们只需返回另一个节点c

现在,控制返回到第一个呼叫:

  • a.left=c

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

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

控制室回到第一次通话:

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

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

Merged Tree:

  a
 /
c

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

 类似资料:
  • 我有一个很严重的问题,就是在一棵树中重复搜索子树。 我试过了,但是。。。 似乎没有正确的形式。containsTree函数在找到与另一个节点不同的节点时停止搜索。 下面是两棵树的例子。 在这种情况下,当函数比较右边的子树和左边的子树时,当find等于父节点但它有不同的子节点时,它会停止搜索。我需要函数不要停止搜索,而是抛出这一点,搜索所有其他子节点及其子树。

  • 我有一些递归遍历二叉树的代码。 我需要一些帮助来了解正在发生的事情。我了解递归,我知道如何以迭代的顺序遍历二叉树,但似乎看不到这个递归解决方案的效果。 因此,如果'节点'不是无,我们将调用node.left递归函数,直到我们到达一个前导节点,在这种情况下node.left是无,然后我们移动到下一行'result.append(node.val)'? - 这对吗? 然后在“节点”上调用递归函数。对吧

  • 所以我一直在看这个函数,它对我来说毫无意义。 假设我有一棵由一个根组成的树,它只剩下一个孩子。所以root->leftchild。

  • 我目前正在尝试实现一个树(不是二进制的,顺序不重要,不是定向的)数据结构。当一棵树的根与另一棵树的子节点相同时,我希望将树合并在一起 第一棵树的子树应该成为第二棵树的子树,第二棵树的子树与第一棵树的根相同。要合并的树可能更深。 我实现了像这样: 然后我有一个树列表

  • 我正在研究合并两个二叉树的问题(https://www.geeksforgeeks.org/merge-two-binary-trees-node-sum/)我很难理解一些递归。为什么要将递归语句设置为和?当你这样做的时候,是否等于两个值? 我只是不确定为什么我们要将递归语句设置为t1.leftt1.right'

  • 平衡二叉树被定义为任何节点的两个子树的高度相差不超过一的树。 我的问题是,如果其中一个子树不存在或基本上子树为空怎么办