๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/LeetCode

[LeetCode] 863. All Nodes Distance K in Binary Tree (ํŒŒ์ด์ฌ/python)

by chjcoder 2023. 8. 8.

๐ŸŽˆ๋ฌธ์ œ

All Nodes Distance K in Binary Tree - LeetCode

 

๐ŸŽ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜?

1. ๋‹จ์ˆœํžˆ ๊ฑฐ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ํŒ๋‹จํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ž์‹ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด์— ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•œ๋‹ค.

2. ๊ทธ๋ž˜ํ”„๋กœ ๋ฐ”๊ฟ”์ค€ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ BFS๋ฅผ ์ด์šฉํ•ด ๊ฑฐ๋ฆฌ๊ฐ€ k์ธ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ๋‹ค.

 

 

๐Ÿ’ป์ฝ”๋“œ

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def distanceK(self, root: TreeNode, target: TreeNode, k: int) -> List[int]:
        if k == 0:
            return [target.val]
        
        # 1. ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๋งŒ๋“ค๊ธฐ
        graph = collections.defaultdict(list)
        
        deq = collections.deque([root])
        # print('deq: ',deq)

        while deq:
            node = deq.popleft()

            if node.left:
                '''
                ์ž์‹ ๋…ธ๋“œ์—์„œ ๋ถ€๋ชจ ๋…ธ๋“œ, ๋ถ€๋ชจ๋…ธ๋“œ์—์„œ ์ž์‹๋…ธ๋“œ
                ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ด์–ด์ ธ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ชจ๋‘ ์ถ”๊ฐ€
                '''
                graph[node].append(node.left)
                graph[node.left].append(node)

                deq.append(node.left)   # ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด

            if node.right:
                graph[node].append(node.right)
                graph[node.right].append(node)

                deq.append(node.right)

        # 2. ๋งŒ๋“  ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•ด bfsํƒ์ƒ‰ 
        result = [] # ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ
        visited = set([target])    # ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์ง€์ง€ ์•Š๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฌธ ๋ฆฌ์ŠคํŠธ

        deq = collections.deque([(target, 0)])

        while deq:
            node, distance = deq.popleft()

            if distance == k:
                result.append(node.val)
            else:
                for edge in graph[node]:
                    if edge not in visited:
                        visited.add(edge)
                        deq.append((edge, distance+1))
        
        return result