>

TIL

5주차 Day 2. 이진 트리

ekdud 2024. 7. 23. 22:23

🤍

    트리 구조 

    1) 직접 클래스를 구현하기

     

    2) 배열로 표현하기
    : 완전 이진 트리는 왼쪽부터 데이터가 쌓이므로 이를 순서대로 배열에 쌓으면서 표현하는 것. (BFS 순으로 배열에 넣는다)

     

    - 완전 이진 트리(단, 각 레벨에 노드가 꽉 차있다고 가정할 때)

    : 레벨이 k이, 각 레벨에 최대로 들어갈 수 있는 노드의 개수는 2^k개.

    즉, 높이가 h일 때 최대 노드의 개수(N)2^(h+1) - 1 개이다. *트리의 높이는 레벨 0(루트 노드)부터 센다.

    N = 2^(h+1) - 1 일 때,  h = log₂(N=1) - 1  완전 이진트리 노드의 경우에 이렇고,

    이진 트리의 높이는 최대 O(log(N))이다.

     

     

    이진 트리 구현

    # 트리 구현
    from binarytree.structures import TreeNode
    
    
    def make_tree_by(lst, idx):
        parent = None
        if idx < len(lst):
            value = lst[idx] # 부모노드의 인덱스 값 전달
            if value is None:
                return
    
    		# 부모 노드가 None이 아니라면.
            parent = TreeNode(value)
            parent.left = make_tree_by(lst, 2 * idx + 1) # 왼쪽에 트리노드를 만들어 붙임.
            parent.left = make_tree_by(lst, 2 * idx + 2) # 오른쪽에 트리노드를 만들어 붙임.
    
        return parent
        
        
        
        class TreeNode:
        def __init__(self, val, left=None, right=None):
            self.val = val
            self.left = left
            self.right = right
    # 이진트리의 최대 깊이 구하기
    from collections import deque
    
    from binarytree.prac import make_tree_by
    
    
    def test_max_depth(lst):
        root = make_tree_by(lst, 0) # 리스트를 트리로.
        if not root: # 루트가 없으면 0 반환.
            return 0
    
        q = deque([root]) # 루트가 있으면 queue에 넣는다.
        depth = 0
    
        while q:
            depth += 1 # 레벨 개수
            for _ in range(len(q)): 
                cur = q.popleft()
                if cur.left: # 왼쪽 노드가 있다면.
                    q.append(cur.left) # 레벨의 노드들을 넣어줌
                if cur.right: # 오른쪽 노드가 있다면.
                    q.append(cur.right)
    
        return depth

     

     

    이진 트리 반전시키기

    from binarytree.prac import make_tree_by, make_lst_by
    
    
    def test_invert_btree(lst):
        if not lst:
            return []
    
        def invert(parent): # 반전시키기.
            if parent:
                parent.left, parent.right = invert(parent.right), invert(parent.left)
                return parent
    
        root = make_tree_by(lst, 0)
        return make_lst_by(invert(root))
    
    '''
    테스트케이스
    assert test_invert_btree(lst=[]) == []
    assert test_invert_btree(lst=[2]) == [2]
    assert test_invert_btree(lst=[2, 1, 3, 5, 6, 2, 3]) == [2, 3, 1, 3, 2, 6, 5]
    assert test_invert_btree(lst=[4, 2, 7, 1, 3, 6, 9]) == [4, 7, 2, 9, 6, 3, 1]
    '''

     

     

     

    이진 탐색 트리

     

    Input: root = [8, 3, 10, 1, 6, 14, None, None, 4, 6, 13, None]