이직하고만다(분노)

99클럽 코테 스터디 11일차 TIL : 깊이/너비 우선 탐색 (DFS/BFS)+후위순회(트리순회)

xxo_ohii 2024. 6. 2. 02:39
728x90

 

https://leetcode.com/problems/evaluate-boolean-binary-tree

 

이번 문제도 어제처럼 노드 무더기로 나오는 문제

머리아프지만 뭔가 익숙해지는건가

재밌다

 

 

오늘 추가로 배운 개념은 후위순회

https://yoongrammer.tistory.com/70

 

[자료구조] 트리 순회 (Tree Traversal)

목차 트리 순회 (Tree Traversal) 트리의 모든 노드들을 방문하는 과정을 트리 순회(TreeTraversal)라고 합니다. 선형 자료 구조(연결 리스트, 스택, 큐 등)는 순차적으로 요소에 접근하지만 트리 자료구

yoongrammer.tistory.com

 

스터디원이 올려주신 자료인데 이해하기가 쉽게 정리되어있음

문제풀기전에 노드 그림 한번보고

이거 한번 봤더니 대충 어떻게 풀어야될지 감이와서

바로 문제 풀기

 

# 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 TreeNode:
    def __init__(self,val=0, left=None,right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def evaluateTree(self, root: Optional[TreeNode]) -> bool:
        #뭔가 자꾸 밑에서 삭제되는거보니 후위 순회인듯?(삭제할떄주로사용)
        #자식이없는 노드를 리프노드라고함
        if root:
            #왼쪽 비교: 왼쪽에 자식 노트있는지 없는지 확인
            if root.left is None and root.right is None:
                #루트기준으로 양 옆으로 없음-> 그대로 반환
                return bool(root.val)
            root_left = self.evaluateTree(root.left) #정의되지않았대서 self(재귀호출)
            root_right = self.evaluateTree(root.right)
            if root.val == 2: # or은 2 값이라함(문재)
                return root_left or root_right
            if root.val == 3: # and는 3
                return root_left and root_right

 

자세히 리뷰해보자면

# 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 TreeNode:
    def __init__(self,val=0, left=None,right=None):
        self.val = val
        self.left = left
        self.right = right

 

먼저 친절한 리트코드의 힌트로

클래스 TreeNode 초기 코드를 만들어주고

 

class Solution:
    def evaluateTree(self, root: Optional[TreeNode]) -> bool:
        #뭔가 자꾸 밑에서 삭제되는거보니 후위 순회인듯?(삭제할떄주로사용)
        #자식이없는 노드를 리프노드라고함
        if root:

 

밑에 해결할 클래스(solution)도 선언해주고

if root: 로 루드노드가 있을때만 실행되도록 해줬다

아 ...

그럼 루트노드없이 아무것도 없을때는

none리턴하게 밑에 써줘야하나?

아무튼 루트가 있다는 가정하에

 

            #왼쪽 비교: 왼쪽에 자식 노트있는지 없는지 확인
            if root.left is None and root.right is None:
                #루트기준으로 양 옆으로 없음-> 그대로 반환
                return bool(root.val)

 

이 루트노드가 리프? 인지 아닌지 판단해야댐

-> 리프면 T/F 라고했으니

바로리턴하게

 

## 처음 알게된거: 리프 - 밑에 자식노드가 없는 애

 

아무튼 왼쪽이랑 오른쪽이 없으면(none)

root의 val 값을 bool로 체크해서 리턴함

=> 왜 bool 체크하냐 ? 그냥 리턴하면 1.0나오니까

bool함수로 T/F 변환해서 리턴

 

            root_left = self.evaluateTree(root.left) #정의되지않았대서 self(재귀호출)
            root_right = self.evaluateTree(root.right)
            if root.val == 2: # or은 2 값이라함(문재)
                return root_left or root_right
            if root.val == 3: # and는 3
                return root_left and root_right

 

그리고 마지막으로

루트값이 2 냐 3이냐 에따라

or, and 값으로 리턴하면 끝

 

728x90