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

โปรแกรมค้นหาบรรพบุรุษ Kth ของโหนดทรีใน Python


สมมติว่าเรามีต้นไม้ที่มี n โหนดที่มีหมายเลขตั้งแต่ 0 ถึง n-1 ต้นไม้ถูกกำหนดโดยอาร์เรย์หลัก โดยที่ parent[i] คือพาเรนต์ของโหนด i รากของต้นไม้คือโหนด 0 เราต้องหาบรรพบุรุษที่ k ของโหนดที่ระบุ ถ้าไม่มีบรรพบุรุษอยู่ ให้คืนค่า -1

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

โปรแกรมค้นหาบรรพบุรุษ Kth ของโหนดทรีใน Python

ผลลัพธ์จะเป็น 2 เพราะบรรพบุรุษแรกของโหนด 6 คือ 5 และที่สองคือ 2

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

  • กำหนดฟังก์ชัน Solve() นี่จะนำพาเรนต์, โหนด, k

  • ถ้าโหนดเหมือนกับ -1 แล้ว

    • กลับ -1

  • มิฉะนั้นเมื่อ k เท่ากับ 1 แล้ว

    • ส่งคืนพาเรนต์[โหนด]

  • มิฉะนั้นเมื่อ (k AND k-1) เป็นศูนย์ ดังนั้น

    • ผลตอบแทนการแก้ (พาเรนต์, แก้ปัญหา (พาเรนต์, โหนด, ผลหารของ k/2) , ผลหารของ k/2)

  • มิฉะนั้น

    • msb :=2^(จำนวนบิตของ k -1)

    • คืนค่าการแก้ (พาเรนต์, แก้ปัญหา (พาเรนต์, โหนด, k-msb) , msb)

ตัวอย่าง

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

def solve(parent, node, k):
   if node == -1:
      return -1
   elif k == 1:
      return parent[node]
   elif not (k & k-1):
      return solve(parent, solve(parent, node, k >> 1), k >> 1)
   else:
      msb = 1 << (k.bit_length()-1)
      return solve(parent, solve(parent, node, k-msb), msb)

parent = [-1,0,0,1,2,2,5,5]
node = 6
k = 2
print(solve(parent, node, k))

อินพุต

[6,7,9,16,22], 2

ผลลัพธ์

2