สมมติว่าเรามีต้นไม้ที่มี n โหนดที่มีหมายเลขตั้งแต่ 0 ถึง n-1 ต้นไม้ถูกกำหนดโดยอาร์เรย์หลัก โดยที่ parent[i] คือพาเรนต์ของโหนด i รากของต้นไม้คือโหนด 0 เราต้องหาบรรพบุรุษที่ k ของโหนดที่ระบุ ถ้าไม่มีบรรพบุรุษอยู่ ให้คืนค่า -1
ดังนั้นหากอินพุตเป็นแบบ
ผลลัพธ์จะเป็น 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