๋ฌธ์ ์ค๋ช
binary tree
์ root node
์ ๋ํ ํฌ์ธํฐ๊ฐ ์ฃผ์ด์ง๋ฉด binary tree
์ top view
๋ฅผ print
ํ ๊ฒ.top view
๋, node
์ ์์์ ๋ณธ tree
๋ฅผ ๋ปํจ.
์์ 1.
input : 1 2 5 3 4 6
1 \ 2 \ 5 / \ 3 6 \ 4
Top View
:1
โ2
โ5
โ6
์์ 2.
input : 1 10 4 3 2 7 5 6 11 15 13 17
1 \ 10 / \ 4 11 / \ \ 3 7 15 / / \ / \ 2 5 6 13 17
Top View
:2
โ3
โ1
โ10
โ11
โ15
โ17
์ ๋ ฅ ์์
1 2 5 3 4 6
1
\
2
\
5
/ \
3 6
\
4
์ถ๋ ฅ ์์
1 2 5 6
์ค๋ช
From the top, only nodes
1, 2, 5, 6
are visible.
๊ธฐ๋ณธ ์ ๊ณต Code
class Node:
def __init__(self, info):
self.info = info
self.left = None
self.right = None
self.level = None
def __str__(self):
return str(self.info)
class BinarySearchTree:
def __init__(self):
self.root = None
def create(self, val):
if self.root == None:
self.root = Node(val)
else:
current = self.root
while True:
if val < current.info:
if current.left:
current = current.left
else:
current.left = Node(val)
break
elif val > current.info:
if current.right:
current = current.right
else:
current.right = Node(val)
break
else:
break
Input & Output
tree = BinarySearchTree()
t = int(input())
arr = list(map(int, input().split()))
for i in range(t):
tree.create(arr[i])
topView(tree.root)
Code 1 : BFS
๐ Logic
์ค๋ช
- ์์์ ๋ฐ๋ผ๋ดค์ ๋ ์ต์ด๋ก ๋ณด์ด๋
Node
๋ง ๋ด์์ผ ํ๋ ์กฐ๊ฑด์ ๊ณ ๋ คํ์ฌ tree์์์ ์ํlevel
๊ฐ๋ ์ ๋น๋์ด ์ข์ฐlevel
๊ฐ๋ ์depth
๋ผ๋ ๊ฐ์ผ๋ก ํ์ฉ- ์ ์ฒด
Node
๋ฅผ ํ์ํ๋ฉด์ ์กฐ๊ฑด์ ๋ง๋Node
๋ง ์ฐพ์์ผ ํ๋ฏ๋กBFS
๊ฐ๋ ์ฌ์ฉ
from collections import deque
def topView(root):
# ๊ฒฐ๊ณผ๋ฅผ ๋ด์ dict ์์ฑ
# depth(ํด๋น ๋
ธ๋์ ์ข์ฐ ํญ์ ๋จ๊ณ)์ node.info(ํด๋น ๋
ธ๋์ value)๋ฅผ dict ํํ๋ก ๋ด์ ์์
result = {}
# queue ์๋ฃ๊ตฌ์กฐ ์ด์ฉ์ ์ํด deque ํจ์ ์ฌ์ฉ
queue = deque([])
# root node๋ถํฐ ์งํํ๊ธฐ ์ํด queue์ ์ถ๊ฐ
# ์ข์ฐ ํญ์ ๋จ๊ณ(depth)๋ฅผ ์ซ์๋ก ํํํ๊ธฐ ์ํด ๊ฐ ๋
ธ๋๋ฅผ [node, depth] ๋ก ํํ
# root node๋ [root, 0]์ผ๋ก ํํ
queue.append(([root,0]))
# queue๊ฐ ๋น ๋๊น์ง ์งํ
while(queue):
# ํ์ฌ level์์ ๊ฐ์ฅ ์์ ์๋(depth๊ฐ ๊ฐ์ฅ ๋ฎ์) node๋ฅผ ์ ํ
current_node = queue.popleft()
# ๋ง์ฝ, ํด๋น depth์ node์ ๋ํ ๋ฐ์ดํฐ๊ฐ result์ ์๋ค๋ฉด
if not current_node[1] in result:
# ํ์ฌ ๋
ธ๋์ depth:info ๋ฅผ result์ ์ถ๊ฐ
result[current_node[1]] = current_node[0].info
# ๋ง์ฝ, ํ์ฌ ๋
ธ๋์ ์ผ์ชฝ ์์ ๋
ธ๋๊ฐ ์๋ค๋ฉด
if current_node[0].left:
# ๊ทธ ๋
ธ๋๋ฅผ [node, depth] ํํ์ ์๋ฃํ์ผ๋ก queue์ ์ถ๊ฐ
# ๊ทธ ๋
ธ๋์ depth๋ ํ์ฌ ๋
ธ๋์ depth๋ณด๋ค 1์ด ์์ (์ผ์ชฝ์ผ๋ก ์ด๋ํ๋๊น)
queue.append([current_node[0].left, current_node[1]-1])
# ๋ง์ฝ, ํ์ฌ ๋
ธ๋์ ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋๊ฐ ์๋ค๋ฉด
if current_node[0].right:
# ๊ทธ ๋
ธ๋๋ฅผ [node, depth] ํํ์ ์๋ฃํ์ผ๋ก queue์ ์ถ๊ฐ
# ๊ทธ ๋
ธ๋์ depth๋ ํ์ฌ ๋
ธ๋์ depth๋ณด๋ค 1์ด ํผ (์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋๊น)
queue.append([current_node[0].right, current_node[1]+1])
# depth ๊ธฐ์ค์ผ๋ก dict๋ฅผ ์ ๋ ฌํ๊ธฐ ์ํด items() ๋ฉ์๋๋ฅผ ์ฌ์ฉ
# depth ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ์, top view ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๋ถํฐ ์์๋๋ก ์ ๋ ฌ๋จ.
for depth, value in sorted(result.items()):
print(str(value), end=" ")
Code 2 : DFS
๐ Logic
์ค๋ช
- ์์์ ๋ฐ๋ผ๋ดค์ ๋ ์ต์ด๋ก ๋ณด์ด๋
Node
๋ง ๋ด์์ผ ํ๋ ์กฐ๊ฑด์ ๊ณ ๋ คํ์ฌ tree์์์ ์ํlevel
๊ฐ๋ ์ ๋น๋์ด ์ข์ฐlevel
๊ฐ๋ ์depth
๋ผ๋ ๊ฐ์ผ๋ก ํ์ฉroot Node
๋ถํฐ ์์ํ์ฌ ์ฐ๊ฒฐ๋ ์์Node
๋ค์ ๋ํดlevel
์ ๋ฎ์ถฐ๊ฐ๋ฉฐdepth
์count
(root node๋ก๋ถํฐ์ ์ด๋ ํ์)๋ฅผ ๊ณ์ฐ โDFS
๊ฐ๋ ์ ์ฌ์ฉํ๋ ์ด์depth
๊ฐ ๋์ผํNode
๋ค์ ๋ํด์๋count
๊ฐ ์ ์Node
๊ฐ top view์์ ๋ฐ๊ฒฌ๋๋Node
๋ผ๋ ์ ์ ์ฝ๋๋ก ๊ตฌํ
# binary tree์ ๋ชจ๋ Node์ ๋ํด depth(์ข/์ฐ level)์ count(์ด๋ ํ์)๋ฅผ ๊ณ์ฐํ์ฌ ์์์ ์ธ๊ธํ ์กฐ๊ฑด์ ๋ง๋ Node๋ง ์ถ์ถํ๋ ํจ์๋ฅผ ์์ฑ
def traversal(root, depth, count, temp):
# root Node๊ฐ ์์ผ๋ฉด ์ข
๋ฃ์ํด
if root is None:
return
# ํ์ฌ ๋
ธ๋์ depth๊ฐ temp์ ์๋ค๋ฉด
if depth not in temp:
# ํ์ฌ ๋
ธ๋์ depth์ [value, count]๋ฅผ dictionary ํํ๋ก temp์ ๋ด์
temp[depth] = [root.info, count]
# ํ์ฌ ๋
ธ๋์ ๋์ผํ depth๋ฅผ ๊ฐ๋ ๋
ธ๋๊ฐ temp์ ์๋ ๊ฒฝ์ฐ,
# ํด๋น ๋
ธ๋์ count๋ณด๋ค ํ์ฌ ๋
ธ๋์ count๊ฐ ๋ ์๋ค๋ฉด
if count < temp[depth][1]:
# ๊ทธ depth๋ฅผ ๊ฐ๋ ๋
ธ๋์ ์ ๋ณด๋ฅผ ํ์ฌ ๋
ธ๋์ ์ ๋ณด๋ก ๊ฐฑ์
# ํ๋ง๋๋ก ์ง๊ธ ๋
ธ๋์ depth, info, count๋ก ๋ฐ๊ฟ์ค๋ค ์ด๋ง์
# ์๋๋ฉด, count๊ฐ ์๋ค๋ ๊ฒ์ ์ด๋์ ์ ๊ฒํ๋ค๋ ๊ฒ์ด๊ณ ๊ทธ ๋ง์ธ์ฆ
# ์์ level์ ์์นํ Node์ด๊ธฐ ๋๋ฌธ์ top view์์ ๋จผ์ ๋ณด์ธ๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ
temp[depth] = [root.info, count]
# ์ฌ๊ท๋ฅผ ํธ์ถํ์ฌ ์ฐ์ธก/์ข์ธก ๋ชจ๋ ์ ๋ถ ๊ณ์ฐ
# ์ด๋ํด์ ์ฐพ๋ ๊ฒ์ธ๋ฐ, ์ด๋์ ๋ฌด์กฐ๊ฑด count๊ฐ (+1)๋๊ณ ,
# ์ข/์ฐ ์ฌ๋ถ์ ๋ฐ๋ผ depth๋ (-1) ํน์ (+1)๋จ.
traversal(root.right, depth + 1, count + 1, temp)
traversal(root.left, depth - 1, count + 1, temp)
def topView(root):
# top view๋ก ๋ฐ๋ผ๋ณด์์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ dict ์ ์ธ
temp = dict()
# root Node๋ถํฐ ์ ๋ถ ํ์ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ dict์ ๋ด์
traversal(root, 0, 0, temp)
# depth ๊ธฐ์ค์ผ๋ก dict๋ฅผ ์ ๋ ฌํ๊ธฐ ์ํด items() ๋ฉ์๋๋ฅผ ์ฌ์ฉ
# depth ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ์, top view ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ๋ถํฐ ์์๋๋ก ์ ๋ ฌ๋จ.
for i in sorted(temp.items()):
print(i[1][0], end = ' ')