ধরুন আমাদের n নোড সহ একটি গাছ আছে যা 0 থেকে n-1 পর্যন্ত সংখ্যাযুক্ত। ট্রিটি একটি প্যারেন্ট অ্যারে দ্বারা দেওয়া হয়, যেখানে প্যারেন্ট[i] হল নোড i এর প্যারেন্ট। গাছের মূল হল নোড 0। আমাদের একটি প্রদত্ত নোডের kth পূর্বপুরুষ খুঁজে বের করতে হবে, যদি পূর্বপুরুষ উপস্থিত না থাকে, তাহলে -1 ফেরত দিন
সুতরাং, যদি ইনপুট মত হয়

তাহলে আউটপুট হবে 2 কারণ নোড 6 এর প্রথম পূর্বপুরুষ 5 এবং দ্বিতীয়টি 2।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি ফাংশন সংজ্ঞায়িত করুন solve()। এর জন্য প্যারেন্ট, নোড, কে
লাগবে -
যদি নোড -1 এর মত হয়, তাহলে
-
রিটার্ন -1
-
-
অন্যথায় যখন k 1 এর মত হয়, তখন
-
অভিভাবক [নোড]
ফেরত দিন
-
-
অন্যথায় যখন (k এবং k-1) শূন্য হয়, তখন
-
রিটার্ন সলভ(প্যারেন্ট, সলভ(প্যারেন্ট, নোড, k/2 এর ভাগফল), k/2 এর ভাগফল)
-
-
অন্যথায়,
-
msb :=2^(k -1 এর বিটের সংখ্যা)
-
রিটার্ন সল্ভ(প্যারেন্ট, সল্ভ(প্যারেন্ট, নোড, কে-এমএসবি) , এমএসবি)
-
উদাহরণ
আসুন আরও ভালভাবে বোঝার জন্য নিম্নলিখিত বাস্তবায়ন দেখি
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