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

โปรแกรมค้นหาความยาวของเส้นทางสลับที่ยาวที่สุดของไบนารีทรีใน python


สมมติว่าเรามีไบนารีทรี เราต้องหาเส้นทางที่ยาวที่สุดที่สลับกันไปมาระหว่างลูกซ้ายและขวาและลงไป

ดังนั้นหากอินพุตเป็นแบบ

โปรแกรมค้นหาความยาวของเส้นทางสลับที่ยาวที่สุดของไบนารีทรีใน python

จากนั้นเอาต์พุตจะเป็น 5 เนื่องจากเส้นทางสลับกันคือ [2, 4, 5, 7, 8]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:

  • ถ้ารูทเป็นโมฆะ
    • คืน 0
  • กำหนดฟังก์ชัน dfs() นี้จะใช้โหนด นับ แฟล็ก
  • ถ้าโหนดไม่เป็นโมฆะ
    • ถ้าแฟล็กเหมือนกับ True แล้ว
      • a :=dfs(ด้านซ้ายของโหนด นับ + 1 เท็จ)
      • b :=dfs(ด้านขวาของโหนด, 1, จริง)
    • มิฉะนั้น เมื่อแฟล็กเหมือนกับ False แล้ว
      • a :=dfs(ทางขวาของโหนด นับ + 1 จริง)
      • b :=dfs(ซ้ายของโหนด 1, เท็จ)
    • ผลตอบแทนสูงสุดของ a, b
  • จำนวนคืนสินค้า
  • จากวิธีหลัก ให้ทำดังนี้:
  • 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