알고리즘/개념
트리(Tree) 예시
문승주
2023. 8. 6. 14:57
반응형
바이너리 트리(BinaryTree)
class Node:
def __init__(self, value=0, left=None, right=None):
self.value = value
self.left = left
self.right = right
class BinaryTree:
def __init__(self):
self.root = None
bt = BinaryTree()
bt.root = Node(value=1)
bt.root.left = Node(value=2)
bt.root.right = Node(value=3)
bt.root.left.left = Node(value=4)
bt.root.left.right = Node(value=5)
bt.root.right.right = Node(value=6)
BFS(너비우선탐색)
from collections import deque
root = 0
def bfs(root):
# 노드 방문 여부
visited = []
if root is None:
return 0
q = deque()
q.append(root)
while q:
cur_node = q.popleft()
visited.append(cur_node.value)
# 좌측 자식 노드
if cur_node.left:
q.append(cur_node.left)
# 우측 자식 노드
if cur_node.right:
q.append(cur_node.right)
return visited
# BFS 함수 호출
bfs(root)
DFS(깊이우선탐색)
1. 호출
def dfs(root):
if root is None:
return
dfs(root.left)
dfs(root.right)
2. 전위 순회
def preorder(cur_node):
if cur_node is None:
return
# 자식 노드중에 자신의 노드 먼저 방문
print(cur_node.value)
preorder(cur_node.left)
preorder(cur_node.right)
3. 중위 순회
def inorder(cur_node):
if cur_node is None:
return
inorder(cur_node.left)
# 좌측 자식 노드 방문 후 자신의 노드 방문
print(cur_node.value)
inorder(cur_node.right)
4. 후위 순회
def postorder(cur_node):
if cur_node is None:
return
postorder(cur_node.left)
postorder(cur_node.right)
# 자식 노드 방문 후 자신의 노드 방문
print(cur_node.value)
바이너리 트리와 해당 트리에 속한 두개의 노드가 주어졌을 때 두노드의 조상중 가장 낮은 노드 찾기
def LCA(root, p,q):
if root == None:
return None
# 좌측 자식 노드
left = LCA(root.left, p, q)
# 우측 자식 노드
right = LCA(root.right, p, q)
# 시작노드일 경우
if root == p or root == q:
return root
# 둘 다 값이 있는 경우 공통된 조상
elif left and right:
return root
# 둘 중에 값이 있으면 return
return left or right
주어진 바이너리 트리의 최대 깊이를 반환해라
- 내 풀이(Level-Order)
from collections import deque
def BFS(root, count):
result = 0
if root is None:
return 0
visited = {}
q = deque()
q.append((root, count))
while q:
s, cnt = q.popleft()
visited[s] = 1
if s.left and s.left not in visited:
q.append((s.left, cnt + 1))
result = max(result, cnt + 1)
if s.right and s.right not in visited:
q.append((s.right, cnt + 1))
result = max(result, cnt + 1)
return result
# 트리 만들기
class TreeNode:
def __init__(self, l=None, r=None, v=0):
self.left = l
self.right = r
self.value = v
root = TreeNode(v=3)
root.left = TreeNode(v=9)
root.right = TreeNode(v=20)
root.right.left = TreeNode(v=15)
root.right.right = TreeNode(v=7)
print(BFS(root, 1))
- 강의 풀이(Level-Order)
from collections import deque
def maxDepth(root):
max_depth = 0
if root is None:
return max_depth
q = deque()
q.append((root, 1))
while q:
cur_node, cur_depth = q.popleft()
max_depth = max(max_depth, cur_depth)
if cur_node.left:
q.append((cur_node.left, cur_depth + 1))
if cur_node.right:
q.append((cur_node.right, cur_depth + 1))
return max_depth
# 트리 만들기
class TreeNode:
def __init__(self, l=None, r=None, v=0):
self.left = l
self.right = r
self.value = v
root = TreeNode(v=3)
root.left = TreeNode(v=9)
root.right = TreeNode(v=20)
root.right.left = TreeNode(v=15)
root.right.right = TreeNode(v=7)
print(maxDepth(root))
- 내 풀이(Post-Order)
from collections import deque
def DFS(root):
if root is None:
return 0
return max(DFS(root.left),DFS(root.right))+1
# 트리 만들기
class TreeNode:
def __init__(self, l=None, r=None, v=0):
self.left = l
self.right = r
self.value = v
root = TreeNode(v=3)
root.left = TreeNode(v=9)
root.right = TreeNode(v=20)
root.right.left = TreeNode(v=15)
root.right.right = TreeNode(v=7)
print(DFS(root))
- 강의 풀이(Post-Order)
from collections import deque
def maxDepth(root):
if root is None:
return 0
left_depth = maxDepth(root.left)
right_depth = maxDepth(root.right)
return max(left_depth,right_depth)+1
# 트리 만들기
class TreeNode:
def __init__(self, l=None, r=None, v=0):
self.left = l
self.right = r
self.value = v
root = TreeNode(v=3)
root.left = TreeNode(v=9)
root.right = TreeNode(v=20)
root.right.left = TreeNode(v=15)
root.right.right = TreeNode(v=7)
print(maxDepth(root))
반응형