PS

783. Minimum Distance Between BST Nodes

지기_ 2021. 11. 13. 22:47

1. 그냥 트리를 돌고서 li를 sort

# 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 minDiffInBST(self, root: Optional[TreeNode]) -> int:
        li=[]
        def sol(root):
            li.append(root.val)
            if root.left:
                sol(root.left)
            if root.right:
                sol(root.right)
        sol(root)
        li = sorted(li)
        answer=100000000
        for x, y in zip(li[:-1],li[1:]):
            answer = min(answer, abs(x-y))
        return answer

 

그런데 BST라는 의미는 in-order로 정렬할 때 오름차순으로 정렬된다는 특징이 있다는 것!

아래는 BST 성질을 이용해서 푼 경우. 그냥 그때그때 보면서 업데이트 해줘도 된다(제출할 땐 print 빼기)

 

# 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 __init__(self, prev=100000000, m=100000000):
        self.prev = prev
        self.m = m
    def minDiffInBST(self, root: Optional[TreeNode]) -> int:
        def sol(root):
            if root.left:
                sol(root.left)
            self.m = min(abs(self.prev-root.val), self.m)
            print(self.m, self.prev)
            self.prev=root.val
            
            if root.right:
                sol(root.right)
        sol(root)
        return self.m

 

 

그런데 위가 속도가 더 빠른데, 아마도 abs 때문이라고 생각된다.

파이썬은 dynamic 한 타입형 때문에 비교할 때에도 비교할 객체 타입 비교부터 하기 때문에 속도가 느리다.

abs를 없앴으나 더욱 느려지는 대참사가 나고 있음.. 나중에 생각해 볼 예정

# 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 __init__(self, prev=-100000000, m=100000000):
        self.prev = prev
        self.m = m
        
    def minDiffInBST(self, root: Optional[TreeNode]) -> int:
        def sol(root):
            if root.left:
                sol(root.left)
            self.m = min(root.val-self.prev, self.m)
            self.prev=root.val
            if root.right:
                sol(root.right)
        sol(root)
        return self.m