สมมุติว่าเรามีไบนารีทรี เราต้องหา subtree ที่ใหญ่ที่สุดที่มี subtree ด้านซ้ายและขวาเหมือนกัน ความซับซ้อนของเวลาที่ต้องการคือ O(n)
ดังนั้นหากอินพุตเป็นแบบ
แล้วผลลัพธ์ที่ได้จะเป็น
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน Solve() การดำเนินการนี้จะทำการรูท, เข้ารหัส, maxSize, maxNode
-
ถ้า root เป็น None แล้ว
-
คืนค่า 0
-
-
left_list :=รายการที่มีสตริงว่าง
-
right_list :=รายการที่มีสตริงว่าง
-
ls :=แก้ (root.left, left_list, maxSize, maxNode)
-
rs :=แก้ (root.right, right_list, maxSize, maxNode)
-
ขนาด :=ls + rs + 1
-
ถ้า left_list[0] เหมือนกับ right_list[0] แล้ว
-
ถ้า size> maxSize[0] แล้ว
-
maxSize[0] :=ขนาด
-
maxNode[0] :=รูท
-
-
-
encode[0] :=encode[0] ต่อกัน "|" concatenate left_list[0] ต่อ "|"
-
encode[0] :=encode[0] ต่อกัน "|" เชื่อม str(root.data) ต่อกัน "|"
-
encode[0] :=encode[0] ต่อกัน "|" concatenate right_list[0] ต่อ "|"
-
ขนาดคืน
-
จากวิธีหลัก ให้ทำดังนี้ −
-
สูงสุด :=[0]
-
เข้ารหัส :=รายการที่มีสตริงว่าง
-
แก้ (โหนด, เข้ารหัส, สูงสุด, maxNode)
-
ผลตอบแทนสูงสุด
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class TreeNode: def __init__(self, data): self.data = data self.left = self.right = None def solve(root, encode, maxSize, maxNode): if (root == None): return 0 left_list = [""] right_list = [""] ls = solve(root.left, left_list, maxSize, maxNode) rs = solve(root.right, right_list, maxSize, maxNode) size = ls + rs + 1 if (left_list[0] == right_list[0]): if (size > maxSize[0]): maxSize[0] = size maxNode[0] = root encode[0] = encode[0] + "|" + left_list[0] + "|" encode[0] = encode[0] + "|" + str(root.data) + "|" encode[0] = encode[0] + "|" + right_list[0] + "|" return size def largestSubtree(node, maxNode): maximum = [0] encode = [""] solve(node, encode, maximum,maxNode) return maximum root = TreeNode(55) root.left = TreeNode(15) root.right = TreeNode(70) root.left.left = TreeNode(10) root.left.right = TreeNode(25) root.right.left = TreeNode(75) root.right.left.left = TreeNode(65) root.right.left.right = TreeNode(80) root.right.right = TreeNode(75) root.right.right.left = TreeNode(65) root.right.right.right = TreeNode(80) maxNode = [None] maximum = largestSubtree(root, maxNode) print("Root of largest sub-tree",maxNode[0].data) print("and its size is ", maximum)
อินพุต
root = TreeNode(55) root.left = TreeNode(15) root.right = TreeNode(70) root.left.left = TreeNode(10) root.left.right = TreeNode(25) root.right.left = TreeNode(75) root.right.left.left = TreeNode(65) root.right.left.right = TreeNode(80) root.right.right = TreeNode(75) root.right.right.left = TreeNode(65) root.right.right.right = TreeNode(80)
ผลลัพธ์
Root of largest sub-tree 70 and its size is [7]