สมมติว่าเรามีไบนารีทรี เราต้องหาเส้นทางที่ยาวที่สุดที่สลับกันไปมาระหว่างลูกซ้ายและขวาและลงไป
ดังนั้นหากอินพุตเป็นแบบ
จากนั้นเอาต์พุตจะเป็น 5 เนื่องจากเส้นทางสลับกันคือ [2, 4, 5, 7, 8]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
- ถ้ารูทเป็นโมฆะ
- คืน 0
- กำหนดฟังก์ชัน dfs() นี้จะใช้โหนด นับ แฟล็ก
- ถ้าโหนดไม่เป็นโมฆะ
- ถ้าแฟล็กเหมือนกับ True แล้ว
- a :=dfs(ด้านซ้ายของโหนด นับ + 1 เท็จ)
- b :=dfs(ด้านขวาของโหนด, 1, จริง)
- มิฉะนั้น เมื่อแฟล็กเหมือนกับ False แล้ว
- a :=dfs(ทางขวาของโหนด นับ + 1 จริง)
- b :=dfs(ซ้ายของโหนด 1, เท็จ)
- ผลตอบแทนสูงสุดของ a, b
- ถ้าแฟล็กเหมือนกับ True แล้ว
- จำนวนคืนสินค้า
- จากวิธีหลัก ให้ทำดังนี้:
- a :=dfs(left of root, 1, False)
- b :=dfs(ทางขวาของรูท, 1, จริง)
- ผลตอบแทนสูงสุดของ a, b
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:
ตัวอย่าง
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): if not root: return 0 def dfs(node, count, flag): if node: if flag == True: a = dfs(node.left, count + 1, False) b = dfs(node.right, 1, True) elif flag == False: a = dfs(node.right, count + 1, True) b = dfs(node.left, 1, False) return max(a, b) return count a = dfs(root.left, 1, False) b = dfs(root.right, 1, True) return max(a, b) ob = Solution() root = TreeNode(2) root.left = TreeNode(3) root.right = TreeNode(4) root.right.left = TreeNode(5) root.right.right = TreeNode(6) root.right.left.right = TreeNode(7) root.right.left.right.left = TreeNode(8) print(ob.solve(root))
อินพุต
root = TreeNode(2) root.left = TreeNode(3)root.right = TreeNode(4)
root.right.left = TreeNode(5)root.right.right = TreeNode(6)
root.right.left.right = TreeNode(7)root.right.left.right.left = TreeNode(8)
ผลลัพธ์
5