프로그래밍/알고리즘+코딩테스트
LeetCode/617. Merge Two Binary Trees
sleepyotter.
2022. 2. 16. 16:24
굳이 새거 만들어서 하려면 머리가 아프다. 주어진 2개 중 하나를 골라서 다른 녀석을 합쳐주면 편하다.
하지만, 추후 공간 절약을 위해 두 녀석을 delete 해버리고 새로운 녀석 하나만 가지고 있는 것이 좋다. 그러면 굳이 새로 코드를 짤 필요 없이 root2에서 떼올때 root2->left나 right를 nullptr로 밀어주면 될거같다.
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1==nullptr)
return root2;
if(root2==nullptr)
return root1;
//양쪽 다 nullptr이 아니다
//진입해서 만들자
merge(root1, root2);
return root1;
}
void merge(TreeNode* root1, TreeNode* root2)
{
//진입했으면 주어진 위치의 노드들 합친다
root1->val = root1->val + root2->val;
//나와 같은 위치를 탐색하도록 하는 것이 중요하다
//우선 왼쪽을 본다, 둘 다 있으면 합친다
if(root1->left!=nullptr && root2->left!=nullptr)
{
//왼쪽이 있다면 합치라고 한다
merge(root1->left, root2->left);
}
//오른쪽을 본다, 둘 다 있으면 합친다
if(root1->right!=nullptr && root2->right != nullptr)
{
//있다면 합치라고 한다
merge(root1->right, root2->right);
}
//다시, 왼쪽을 봤는데 나는 없고 쟤는 있으면 가져온다.
//얕은 복사 해주면 위쪽에서 가져오면 아래쪽은 자동으로 딸려온다.
if(root1->left==nullptr && root2->left!=nullptr)
{
root1->left = root2->left;
}
//오른쪽도 마찬가지로
if(root1->right == nullptr && root2->right != nullptr)
{
root1->right = root2->right;
}
return;
}
};