알고리즘

[LeetCode] 이진트리 문제 -Feat: 재귀

유병각 2022. 4. 27. 21:13

이진트리

이진트리란?

컴퓨터 과학에서, 이진 트리(二進-, 영어: binary tree)는 각각의 노드가 최대 두 개의 자식 노드를 가지는 트리 자료 구조로, 자식 노드를 각각 왼쪽 자식 노드와 오른쪽 자식 노드라고 한다.

이진트리 관련 문제

https://leetcode.com/problems/merge-two-binary-trees/

  • 이진트리를 병합하는 방법

풀이법_#1. 재귀함수 사용

파이썬 클래스 매서드를 재귀호출하려면 함수이름앞에 self. 을 붙여야함.

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if (not root1):
            return root2
        elif (not root2):
            return root1

        node = TreeNode(root1.val + root2.val)
        node.left = self.mergeTrees(root1.left, root2.left)
        node.right = self.mergeTrees(root1.right, root2.right)

        return node

116번

풀이_#1

재귀함수 사용
재귀함수를 사용할때는 재귀함수의 1번의 싸이클이 무엇을 의도하는지 생각한 뒤 짜야한다.
아래 코드의 경우에는 재귀함수 1번의 싸이클이 인자로 받은 root라는 이름의 노드의 left 와 right child 의 next 를 지정해 주는 역할을 하며,
당연히 재귀가 끝나는 조건은 root 라는 이름이 left 나 right child 를 가지지 않을때이다.
문제의 Follow-up 요구사항에 나와있듯이, space Time O(1) 로 구현했.

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val=0, left=None, right=None, next=None):
        self.val = val
        self.left = left
        self.right = right
        self.next = next
"""

class Solution(object):
    def connect(self, root):
        """
        :type root: Node
        :rtype: Node
        """
        if (not root):
            return root

        if root.left:
            root.left.next = root.right

        if root.right and root.next:
            root.right.next = root.next.left

        if root.left:
            self.connect(root.left)
        if root.right:
            self.connect(root.right)

        return root