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

โปรแกรมหา Root ของ N-ary Tree ใน Python

โจทย์

ได้รับ Nodes ของ N-ary Tree ในอาร์เรย์ (ไม่เรียงลำดับ) ต้องหา Root Node โดยสร้าง Tree ใหม่ แล้วแสดง Preorder Traversal

ตัวอย่าง: Tree เดียวกับข้อก่อนหน้า → Preorder: [14, 27, 32, 42, 56, 65]

อัลกอริธึม (Indegree)

  1. คำนวณ Indegree ของทุก Node (จำนวนครั้งที่ถูกอ้างอิงเป็นลูก)
  2. Node ที่ Indegree = 0 คือ Root

โค้ด Python


import collections

class Node:
    def __init__(self, value, child=None) -> None:
        self.val = value
        self.children = []
        if child:
            for v in child:
                self.children.append(v)

def solve(tree):
    indegree = collections.defaultdict(int)
    for node in tree:
        for child in node.children:
            indegree[child.val] += 1
    for node in tree:
        if indegree[node.val] == 0:
            return node
    return None

def treeprint(node, tree):
    if node is None:
        tree.append("None")
        return tree
    if tree is None:
        tree = []
    tree.append(node.val)
    for child in node.children:
        treeprint(child, tree)
    return tree

# สร้าง Tree
node6 = Node(65)
node5 = Node(56)
node4 = Node(42, [node5, node6])
node3 = Node(32)
node2 = Node(27)
node1 = Node(14, [node2, node3, node4])
tree = [node2, node1, node5, node3, node6, node4]

root = solve(tree)
print(treeprint(root, None))  # Output: [14, 27, 32, 42, 56, 65]

Input / Output

Input:  List of nodes (unordered)
Output: [14, 27, 32, 42, 56, 65]