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

โปรแกรมนับจำนวนวิธีที่เราสามารถแบ่งต้นไม้ออกเป็นสองต้นใน Python


สมมติว่าเรามีไบนารีทรีที่มีค่า 0, 1 และ 2 รูทมีอย่างน้อย 0 โหนดและ 1 โหนด ตอนนี้ สมมติว่ามีการดำเนินการที่เราลบขอบในต้นไม้ และต้นไม้กลายเป็นต้นไม้สองต้นที่แตกต่างกัน เราต้องหาจำนวนวิธีที่เราสามารถลบขอบด้านหนึ่งได้ โดยที่ต้นไม้ทั้งสองต้นไม่ได้มีทั้งโหนด 0 และโหนด 1 โหนด

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

โปรแกรมนับจำนวนวิธีที่เราสามารถแบ่งต้นไม้ออกเป็นสองต้นใน Python

จากนั้นผลลัพธ์จะเป็น 1 เนื่องจากเราสามารถลบขอบ 0 ถึง 2 เท่านั้น

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

  • นับ :=[0, 0, 0]
  • กำหนดฟังก์ชัน dfs() นี่จะใช้โหนด
  • ถ้าโหนดไม่เป็นโมฆะ
    • ก่อน :=นับ
    • dfs(ด้านซ้ายของโหนด)
    • dfs(ด้านขวาของโหนด)
    • count[value of node] :=count[value of node] + 1
    • node.count :=รายการของ (count[i] - pre[i]) สำหรับ i คือ 0 และ 1
  • กำหนดฟังก์ชัน dfs2() นี่จะเป็นโหนดพาร์
  • ถ้าโหนดไม่เป็นโมฆะ
    • ถ้าพาร์ไม่เป็นค่าว่าง
      • (a0, a1) :=จำนวนโหนด
      • (b0, b1) :=(นับ[0] - a0, นับ[1] - a1)
      • ถ้า (a0 เหมือนกับ 0 หรือ a1 เหมือนกับ 0) และ (b0 เหมือนกับ 0 หรือ b1 เหมือนกับ 0) แล้ว
        • อัน :=ans + 1
    • dfs2(ด้านซ้ายของโหนด โหนด)
    • dfs2(ด้านขวาของโหนด โหนด)
  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −
  • dfs(root)
  • ตอบ :=0
  • dfs2(root)
  • คืนสินค้า

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.val = data
      self.left = left
      self.right = right
class Solution:
   def solve(self, root):
      count = [0, 0, 0]
   def dfs(node):
      if node:
         pre = count[:]
         dfs(node.left)
         dfs(node.right)
         count[node.val] += 1
         node.count = [count[i] - pre[i] for i in range(2)]
   dfs(root)
   def dfs2(node, par=None):
      if node:
         if par is not None:
            a0, a1 = node.count
            b0, b1 = count[0] - a0, count[1] - a1
            if (a0 == 0 or a1 == 0) and (b0 == 0 or b1 == 0):
               self.ans += 1
         dfs2(node.left, node)
         dfs2(node.right, node)
   self.ans = 0
   dfs2(root)
   return self.ans
ob = Solution()
root = TreeNode(0)
root.left = TreeNode(0)
root.right = TreeNode(2)
root.right.left = TreeNode(1)
root.right.right = TreeNode(1)
print(ob.solve(root))

อินพุต

root = TreeNode(0)
root.left = TreeNode(0)
root.right = TreeNode(2)
root.right.left = TreeNode(1)
root.right.right = TreeNode(1)

ผลลัพธ์

1