给你一棵树,树上有
n个节点,按从0到n-1编号。树以父节点数组的形式给出,其中parent[i]是节点i的父节点。树的根节点是编号为0的节点。树节点的第
k个祖先节点是从该节点到根节点路径上的第k个节点。实现
TreeAncestor类:
TreeAncestor(int n, int[] parent)对树和父数组中的节点数初始化对象。getKthAncestor``(int node, int k)返回节点node的第k个祖先节点。如果不存在这样的祖先节点,返回-1。
提示:
1 <= k <= n <= 5 * 10^4parent[0] == -1表示编号为0的节点是根节点。- 对于所有的
0 < i < n,0 <= parent[i] < n总成立 0 <= node < n- 至多查询
5 * 10^4次
题目等级:hard
我早就有预感今天会是hard...
尝试自己手扫了一遍,果不其然的TLE了,然后乖乖滚去看题解了...
class TreeAncestor(n: Int, val parent: IntArray) {
val ancestors = Array<IntArray>(n) { IntArray(16) { -1 } }
init {
for (i in 0 until n) { ancestors[i][0] = parent[i]}
for (i in 1 until 16) for (j in 0 until n) {
if (ancestors[j][i - 1] != -1) ancestors[j][i] = ancestors[ancestors[j][i - 1]][i - 1]
}
}
fun getKthAncestor(node: Int, k: Int): Int {
var cur = node
for (i in 0 until 16) {
if ((k shr i) and 1 != 0) {
cur = ancestors[cur][i]
if (cur == -1) return cur
}
}
return cur
}
}
/**
* Your TreeAncestor object will be instantiated and called as such:
* var obj = TreeAncestor(n, parent)
* var param_1 = obj.getKthAncestor(node,k)
*/
涉及到的知识点:倍增 OI-Wiki