1.説明
2つのバイナリツリーが与えられた場合、それらの一方をもう一方にオーバーレイすると、2つのバイナリツリーの一部のノードがオーバーラップすることを想像してください。
それらを新しいバイナリツリーにマージする必要があります。マージのルールは、2つのノードが重複する場合、ノードがマージされた後にそれらの値が新しい値として追加されることです。それ以外の場合、NULLでないノードは新しいバイナリツリーのノードとして直接使用されます。
2.例
入力:
ツリー1ツリー2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
出力:
マージされたツリー:
3
/ \
4 5
/ \ \
5 4 7
3.分析
二分木の定義は再帰的に行われるため、それに対する操作も再帰的に行われます。
この例では、ツリー1のルートノード「1」とツリー2のルートノード「2」がマージされた後、マージされたツリーのルートノード「3」が取得されます。これは、ツリー1のルート「1」にツリー2のルートを加えたものです。 2 "。
次に、ツリー1のルートノード「1」の左側のサブツリーとツリー2のルートノード「2」の左側のサブツリーを
処理し、最後にツリー1のルートノード「1」とツリー2のルートノード「2」の右側のサブツリーを処理します。「正しいサブツリー。
ただし、2つのサブツリーのルートノードが空の場合は空を返します。
特定のサブツリーのノードが空の場合は、他のサブツリーの対応するノードを返します。
それ以外の場合は、ルートノードの値を変更する必要があります。追加、追加の結果をサブツリーに配置(または新しいツリーを作成)、左右のサブツリーで同じ処理を再帰的に実行します。
4.コード
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
// 如果两棵子树的根节点均为空,则返回空
if(t1 == null && t2 == null)
return null;
// 若某棵子树的根节点为空,则返回不为空的根节点
else if(t1 == null)
return t2;
else if(t2 == null)
return t1;
// 否则,两棵子树的根节点均不为空,则将值相加,放到 Tree 1 树中
//递归地对左子树和右子树进行同样的处理
else
{
t1.val += t2.val;
t1.left = mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);
}
return t1;
}
}
5.検証
6.ソース
- LeeCode617。バイナリツリーのマージ
ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/merge-two-binary-trees
著作権はLeetCode Networkが所有しています。