Giả sử chúng ta có một cây với n nút được đánh số từ 0 đến n-1. Cây được cung cấp bởi một mảng cha, trong đó cha [i] là cha của nút i. Gốc của cây là nút 0. Chúng ta phải tìm tổ tiên thứ k của một nút đã cho, nếu tổ tiên không có mặt thì trả về -1
Vì vậy, nếu đầu vào giống như
thì đầu ra sẽ là 2 vì tổ tiên đầu tiên của nút 6 là 5 và nút thứ hai là 2.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Định nghĩa một hàm giải quyết (). Điều này sẽ lấy cha, nút, k
-
nếu nút giống -1, thì
-
trả về -1
-
-
ngược lại khi k giống 1 thì
-
trả về [nút] cha mẹ
-
-
ngược lại khi (k VÀ k-1) bằng 0 thì
-
trả về giải (cha, giải (cha, nút, thương của k / 2), thương của k / 2)
-
-
nếu không,
-
msb:=2 ^ (số bit của k -1)
-
trả về giải quyết (cha, giải quyết (cha, nút, k-msb), msb)
-
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn
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))
Đầu vào
[6,7,9,16,22], 2
Đầu ra
2