给定两棵二叉树,想象一下,当您将其中一棵树覆盖另一棵树时,两棵树的一些节点重叠,而其他节点则不重叠。
您需要将它们合并到一个新的二叉树中。合并规则是,如果两个节点重叠,则将节点值加起来作为合并节点的新值。否则,非空节点将用作新树的节点。
输入:
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、t2或两者均为空,因此该节点将被替换为其中之一(简单)
另一种情况更简单,这个算法首先访问节点,然后在这2棵树的左侧节点上进行递归,然后在右侧,所以它从顶部(根)开始,向下到左侧节点,当它到达最左侧的节点时,它会到达右侧节点,在并且您已经通过了树的所有节点。
只有t1被修改并返回,t2将被忽略。
https://imgur.com/NyDMFge
mergeTrees
仅当“另一个TreeNode”是唯一的TreeNode时返回“另一个TreeNode”(因为其中一个为空),这是有意义的,因为在该子树上没有什么可以做的。但你仍然需要回去工作;特别是,您需要将“另一个TreeNode”附加到它的新父节点,并创建尚未访问的子树。
如果你注意这一行:t1。val=t2。瓦尔
,可以看出我们实际上是在将树2合并到树1中。我们没有创建新的树/节点。
还要注意,我们总是在函数
mergeTrees()
中传递两棵树的相应节点。如果两个节点都非空,我们将t2
的值添加到t1
中。如果其中任何一个为null,那么根据规则,我们必须保留另一个节点(可以是非null或null)。
只有在处理了当前节点的左右子树(如果有的话)之后,我们才会返回
t2
或t1
。此返回值成为上一次调用mergeTrees()
时t1
节点的子节点。
例子:
Tree 1:
a (single node)
Tree 2:
b
/
c
第一个函数调用-
合并树(a,b)
:
这里的a
和b
节点都是非空的。所以我们做了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'
平衡二叉树被定义为任何节点的两个子树的高度相差不超过一的树。 我的问题是,如果其中一个子树不存在或基本上子树为空怎么办