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

โปรแกรมหา Lowest Common Ancestor ใน Binary Tree ด้วย Python

หา LCA ของ 2 โหนดใน binary tree โดยไม่มี parent pointer ใช้ DFS post-order: ถ้าโหนดปัจจุบันเป็นเป้าหมาย (x หรือ y) และซ้ายหรือขวาคืนค่าไม่ใช่ None -> โหนดนี้คือ LCA ถ้าทั้งซ้ายและขวาคืนค่าไม่ใช่ None -> โหนดนี้คือ LCA มิฉะนั้นคืนค่าที่ไม่ใช่ None

อัลกอริทึม

  1. DFS function dfs(node) คืนค่าโหนดที่เจอเป้าหมายหรือ LCA
  2. ถ้า node เป็น x หรือ y: ตรวจสอบ left/right ถ้ามีเจออีกตัวคืน node (LCA)
  3. Recursive left, right
  4. ถ้า left และ right ทั้งคู่ไม่ใช่ None: node คือ LCA
  5. คืน left หรือ right (ตัวที่ไม่ใช่ None)

ตัวอย่างโค้ด


class TreeNode:
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

def make_tree(elements):
    Tree = TreeNode(elements[0])
    for element in elements[1:]:
        insert(Tree, element)
    return Tree

def solve(root, x, y):
    def dfs(node):
        if not node: return None
        if node in [x, y]:
            left = dfs(node.left)
            right = dfs(node.right)
            if left or right:
                return node
        left = dfs(node.left)
        right = dfs(node.right)
        if left and right:
            return node
        return left or right
    return dfs(root)

root = make_tree([5, 3, 7, 2, 4, 1, 7, 6, 8, 10])
print(solve(root, search_node(root, 2), search_node(root, 4)).data)  # Output: 3

อินพุต/เอาต์พุต

Input: tree, nodes 2 and 4
Output: 3