오랜만에 트리 문제를 풀었다. 항상 제일 약한 부분이 트리 파트라고 생각해서 이번에 풀면서 개념을 한번 더 잡고자 했다 ! 이번주 스터디 문제인 백준 26260번 이가 빠진 이진 트리 문제이다.
김소마는 최근에 포화 이진 트리에 대해 배웠다. 포화 이진 트리란, 이진 트리에서 리프 노드를 제외한 모든 노드가 두 자식 노드를 가지며, 모든 리프 노드가 채워진 것을 말한다. 아래의 그림을 통해 쉽게 이해하자.

김소마는 예쁜 포화 이진 검색 트리를 그려 만족했지만, 밥 먹다 흘린 소스가 리프 노드 한 개를 가려버렸다. 여기서 이진 검색 트리란, 모든 왼쪽 자식이 자신보다 작고, 모든 오른쪽 자식이 자신보다 큰 이진 트리를 이야기한다.

그림을 버리려던 찰나, 김소마는 갑자기 포화 이진 검색 트리를 유지하며, 임의의 수를 넣을 때, 트리 구조가 어떻게 바뀔지 궁금해졌다. 멍청한 김소마를 위해 당신이 도와주자.
첫 번째 줄에 가려진 노드를 포함한 노드의 개수 이 주어진다. 는 정수
두 번째 줄에 이 공백으로 구분되어 주어진다. 는 번 노드에 적혀있는 수이다. 가려진 하나의 노드에 대해서만
이면 이다. 노드 번호는 루트 노드부터 시작하여, 같은 깊이 내 왼쪽에서 오른쪽으로 갈수록 증가하는 순서로 매겨진다 (아래 그림 참조).
세 번째 줄에 트리에 넣을 수 가 주어진다.
입력으로 주어지는 모든 수는 정수이다.

첫 번째 줄에 바뀐 트리를 후위(postorder) 순회한 결과를 출력한다. (단, 왼쪽 자식 노드를 먼저 방문한다.)
7
10 5 17 1 -1 14 21
18
1 10 5 17 21 18 14

입력을 받은 후 -1 의 인덱스를 찾아 X로 바꿔준다.
오름차순으로 정렬을 한다.
노드마다 왼쪽 자식과 오른쪽 자식이 있는지 검사하고, 있다면 계속 재귀해서 들어가는 함수를 작성한다.
후위순회 코드로 왼쪽 자식 노드부터 차례대로 출력하게 해두었고, 가장 마지막 레이어에 있는 리프 노드들은 다시 재귀로 들어가지 않아 출력되지 않기 때문에 거리가 0인 노드인 경우 조건도 추가해주었다.
코드는 다음과 같다.
N = int(input())
nodes = list(map(int, input().split()))
X = int(input())
nodes[nodes.index(-1)] = X
nodes.sort()
def solution(n, d):
if not d:
print(nodes[n], d)
return
# 왼쪽 자식 노드가 있는지 확인
if nodes[n - d]:
solution(n - d, d//2)
# 오른쪽 자식 노드가 있는지 확인
if nodes[n + d]:
solution(n + d, d//2)
print(nodes[n], d)
solution(N // 2, (N+1)//4)
N = int(input())
nodes = list(map(int, input().split()))
X = int(input())
nodes[nodes.index(-1)] = X
nodes.sort()
# 노드 클래스
class Node:
def __init__(self, data):
# 해당 노드의 값
self.data = data
# 왼쪽 자식 노드
self.left = None
# 오른쪽 자식 노드
self.right = None
# Binary Search Tree 구현 함수
def BST(nums):
# 빈 리스트가 들어오면 더 이상 자식 노드가 없다는 뜻
if not nums:
return None
# 중간 값이 노드의 값이 된다.
mid = len(nums) // 2
# 각 노드 클래스 생성
root = Node(nums[mid])
# 자식 노드 값 할당
root.left = BST(nums[:mid])
root.right = BST(nums[mid + 1:])
return root
# Binary Search Tree
tree = BST(nodes)
# 위 트리를 후위순회 하는 함수
def postorder(root):
# 노드의 값이 있으면
if root:
# 왼쪽 자식 노드 부터
postorder(root.left)
postorder(root.right)
print(root.data, end=' ')
postorder(tree)

if nodes[n - d]:, if nodes[n + d]: 해당 조건이 잘못되었다. 이와 같은 조건들을 걸게 되면 노드가 존재하지 않을 경우 뿐만 아니라 노드의 값이 0 일 경우에도 통과하지 않는다는 것이었다.N = int(input())
nodes = list(map(int, input().split()))
X = int(input())
nodes[nodes.index(-1)] = X
nodes.sort()
def solution(n, d):
if not d:
print(nodes[n], end=' ')
return
solution(n - d, d//2)
solution(n + d, d//2)
print(nodes[n], end=' ')
solution(N // 2, (N+1)//4)
