Merge Two Binary Trees - LeetCode
두 이진트리 root1, root2가 주어졌을 때 , 둘을 머지하는데 머지규칙은
(17)
root에서부터 시작해서 순서대로 만들면 될 것 같다.
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null) return root2;
if(root2 == null) return root1;
// 새로운 트리의 root 값
TreeNode tree = new TreeNode(root1.val + root2.val);
dfs(root1,root2,tree);
return tree;
}
// 새로운 트리의 root에서부터 시작하여, left, right를 찾는다
public void dfs(TreeNode r1, TreeNode r2, TreeNode t){
// left
// 두 값이 서로 다른 경우 -> sum을 구함 && dfs를 타고 내려간다.
if(r1.left !=null && r2.left != null) {
t.left = new TreeNode(r1.left.val+r2.left.val);
dfs(r1.left,r2.left,t.left);
}
if(r1.left == null) t.left = r2.left;
if(r2.left == null) t.left = r1.left;
// right
if(r1.right !=null && r2.right != null) {
t.right = new TreeNode(r1.right.val+r2.right.val);
dfs(r1.right,r2.right,t.right);
}
if(r1.right == null) t.right = r2.right;
if(r2.right == null) t.right = r1.right;
}
}
현재 내 방식은, 두 트리의 노드를 비교하고는, 매 번 아예 새로운 노드를 생성하는 방식이었다.
이전에 정렬된 두 List를 병합하는 문제에서는 하나의 List를 기준으로 두고 병합을 한 후에 남은 것을 덧붙이는 방식을 취하면서, 매 번 새로운 노드를 생성하는 부담은 없었음.
다른 사람의 풀이에서도, 하나의 트리를 기준으로 두고 푸는 방식이 있었음.
class Solution(object):
def mergeTrees(self, root1, root2):
"""
:type root1: TreeNode
:type root2: TreeNode
:rtype: TreeNode
"""
if root1 is None:
return root2
if root2 is None:
return root1
root1.val += root2.val
root1.left = self.mergeTrees(root1.left,root2.left)
root1.right = self.mergeTrees(root1.right,root2.right)
return root1