题目:
给你一个整数 n ,表示你有一棵含有 2n - 1 个节点的 完全二叉树 。根节点的编号是 1 ,树中编号在[1, 2n - 1 - 1] 之间,编号为 val 的节点都有两个子节点,满足:
- 左子节点的编号为
2 * val - 右子节点的编号为
2 * val + 1
给你一个长度为 m 的查询数组 queries ,它是一个二维整数数组,其中 queries[i] = [ai, bi] 。对于每个查询,求出以下问题的解:
- 在节点编号为
ai和bi之间添加一条边。 - 求出图中环的长度。
- 删除节点编号为
ai和bi之间新添加的边。
算法:
方法一:求最近公共祖先
如果a<b,将b置为b的父亲,count++,相反将a置为a的父亲。直到a==b说明达到的公共节点。
func cycleLengthQueries(n int, queries [][]int) []int {
ans := make([]int, 0)
for _, query := range queries {
a, b := query[0], query[1]
count := 1
for a != b {
if a > b {
a = a / 2
} else {
b = b / 2
}
count ++
}
ans = append(ans, count)
}
return ans
}