Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 n-ary 트리의 복사본을 만드는 프로그램

<시간/>

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

Node:
   value : <integer>
   children : <array>

따라서 입력이 다음과 같으면

Python에서 n-ary 트리의 복사본을 만드는 프로그램

, 출력은

[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]