2509. 查询树中环的长度

72 阅读1分钟

题目:
给你一个整数 n ,表示你有一棵含有 2n - 1 个节点的 完全二叉树 。根节点的编号是 1 ,树中编号在[1, 2n - 1 - 1] 之间,编号为 val 的节点都有两个子节点,满足:

  • 左子节点的编号为 2 * val
  • 右子节点的编号为 2 * val + 1

给你一个长度为 m 的查询数组 queries ,它是一个二维整数数组,其中 queries[i] = [ai, bi] 。对于每个查询,求出以下问题的解:

  1. 在节点编号为 ai 和 bi 之间添加一条边。
  2. 求出图中环的长度。
  3. 删除节点编号为 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
}