Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมสร้างสำเนาของต้นไม้ n-ary ใน Python


สมมติว่าเราได้รับต้นไม้ n-ary ซึ่งรากได้รับ 'ราก' แก่เรา เราต้องทำสำเนาของต้นไม้ไบนารี n-ary แบบเต็ม และทำการสั่งซื้อล่วงหน้าของต้นไม้ทั้งสอง ต้องเก็บทรีที่คัดลอกโดยใช้โหนดรูทอื่น โครงสร้างโหนดของต้นไม้แสดงไว้ด้านล่าง -

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

ดังนั้นหากอินพุตเป็นแบบ

โปรแกรมสร้างสำเนาของต้นไม้ n-ary ใน Python

จากนั้นผลลัพธ์จะเป็น

[14, 27, 32, 42, 56, 65]

การแสดงลำดับล่วงหน้าของแผนผังอินพุตและแผนผังเอาต์พุตจะเหมือนกับการสร้างสำเนาแผนผังที่ถูกต้อง

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ถ้ารูทไม่ว่าง

    • คืนค่ารูท

  • head :=โหนดใหม่ที่มีค่ารูท

  • q :=deque ใหม่ที่มีองค์ประกอบ root และ head

  • ในขณะที่ q ไม่ว่างให้ทำ

    • node :=เปิดองค์ประกอบแรกจาก q

    • โคลน :=ป๊อปองค์ประกอบแรกจาก q

    • สำหรับแต่ละ chld ใน node.children ให้ทำ

      • new_n :=โหนดใหม่ที่มีค่า chld

      • ต่อท้าย new_n กับลูกของโคลน

      • ใส่ chld และ new_n ต่อท้าย q

  • กลับหัว

ตัวอย่าง (Python)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

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]