루트가 우리에게 '루트'로 주어진 n진 트리가 제공되었다고 가정합니다. 우리는 완전한 n-ary 이진 트리의 복사본을 만들고 두 트리의 사전 순서 순회를 수행해야 합니다. 복사된 트리는 다른 루트 노드를 사용하여 저장해야 합니다. 트리의 노드 구조는 다음과 같습니다. -
Node: value : <integer> children : <array>
따라서 입력이 다음과 같으면

, 출력은
[14, 27, 32, 42, 56, 65]
입력 트리 및 출력 트리의 사전 주문 표현은 생성된 트리의 정확한 사본과 동일합니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
루트가 비어 있지 않으면
-
루트 반환
-
-
head :=root 값을 가진 새 노드
-
q :=루트와 헤드 요소를 포함하는 새로운 데크
-
q가 비어 있지 않은 동안 수행
-
node :=q에서 첫 번째 요소 팝
-
cloned :=q에서 첫 번째 요소 팝
-
node.children의 각 chld에 대해
-
new_n :=chld 값을 포함하는 새 노드
-
복제된 자식에 new_n 추가
-
q의 끝에 chld 및 new_n 삽입
-
-
-
머리 반환
예제(파이썬)
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
from queue import deque
class Node:
def __init__(self, value, child = None) -> None:
self.val = value
self.children = []
if child != None:
for value in child:
self.children.append(value)
def solve(root):
if not root:
return root
head = Node(root.val)
q = deque([(root, head)])
while q:
node, cloned = q.popleft()
for chld in node.children:
new_n = Node(chld.val)
cloned.children.append(new_n)
q.append((chld,new_n))
return head
def treeprint(node, tree):
if node == None:
tree.append("None")
return tree
if tree == None:
tree = []
tree.append(node.val)
for child in node.children:
treeprint(child, tree)
return tree
node6 = Node(65)
node5 = Node(56)
node4 = Node(42, [node5, node6])
node3 = Node(32)
node2 = Node(27)
node1 = Node(14, [node2, node3, node4])
root = node1
copynode = solve(root)
print(treeprint(copynode, None)) 입력
node6 = Node(65) node5 = Node(56) node4 = Node(42, [node5, node6]) node3 = Node(32) node2 = Node(27) node1 = Node(14, [node2, node3, node4]) root = node1
출력
[14, 27, 32, 42, 56, 65]