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

โปรแกรมหาเส้นทางความยาว k บนต้นไม้ไบนารีใน Python

สมมติว่ามีต้นไม้ไบนารีที่มีค่าไม่ซ้ำ และมีค่า k เราต้องหาจำนวนเส้นทางที่ไม่ซ้ำกันความยาว k ในต้นไม้ เส้นทางสามารถไปจากพ่อไปลูกหรือลูกไปพ่อ สองเส้นทางถือว่าต่างกันถ้ามีโหนดปรากฏในอันหนึ่งแต่อีกอันไม่มี

เช่น ถ้าอินพุตเป็นต้นไม้ดังภาพ k = 3 ผลลัพธ์จะเป็น 4 เส้นทางคือ [12,8,3], [12,8,10], [8,12,15], [3,8,10]

ขั้นตอนการแก้ปัญหา

  • กำหนดฟังก์ชัน dfs() รับ node
    • ถ้า node เป็น null คืนค่ารายการ [1] + [0]*(K-1)
    • left := dfs(left of node), right := dfs(right of node)
    • for i ในช่วง 0 ถึง K ans := ans + left[i] * right[K-1-i]
    • res := รายการขนาด K เติม 0, res[0] := 1, res[1] := 1
    • for i ในช่วง 1 ถึง K-1 res[i+1] += left[i] + right[i]
    • คืนค่า res
  • จากเมธอดหลัก ans := 0 เรียก dfs(root) คืนค่า ans

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

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

class Solution:
    def solve(self, root, K):
        def dfs(node):
            if not node:
                return [1] + [0] * (K-1)
            left = dfs(node.left)
            right = dfs(node.right)
            for i in range(K):
                self.ans += left[i] * right[K - 1 - i]
            res = [0] * K
            res[0] = res[1] = 1
            for i in range(1, K - 1):
                res[i + 1] += left[i]
                res[i + 1] += right[i]
            return res
        self.ans = 0
        dfs(root)
        return self.ans

ob = Solution()
root = TreeNode(12)
root.left = TreeNode(8)
root.right = TreeNode(15)
root.left.left = TreeNode(3)
root.left.right = TreeNode(10)
print(ob.solve(root, 3))

อินพุต

root = TreeNode(12) root.left = TreeNode(8) root.right = TreeNode(15) root.left.left = TreeNode(3) root.left.right = TreeNode(10) 3

เอาต์พุต

4