← 返回博客列表 Google NG 真题:树状结构中的岛屿计数(DFS 变体)
Google

Google NG 真题:树状结构中的岛屿计数(DFS 变体)

2026-06-15

Google New Grad 的编程轮常把经典题换个壳子来考你迁移能力。这道题就是经典岛屿题的变体——把网格换成了 0/1 树状结构。这篇按 oavoservice 学员的 Google NG 复盘,讲清怎么把"网格岛屿"的 DFS 套路干净地迁移到树上。文末附 VO辅助 / VO代面 的对接路径,给正在校招、转码、后端开发求职的同学一个实战参考。


一、Google NG 编程轮概览

维度 详情
形式 远程视频,单轮约 45 分钟
题量 1 道编程题 + 追问
语言 自选,Python / Java / C++ 常见
考察 图与树遍历、连通块、复杂度、沟通
风格 经典题变体,考迁移能力而非默写

Google NG 的题难度集中在 LeetCode 中等。遇到 adapt 过的经典题,先问"原型是哪道",再把相邻关系迁移过去,比从零硬想高效得多。

二、题目

经典岛屿题,但稍微 adapt 了一下:在一个由 01 组成的树状结构中,一个 island 被定义为一组被 0 包围、或位于树边界的连续 1。写一个算法,求树中有多少个 island。

三、拆题:把"网格岛屿"迁移到"树"

经典岛屿题在网格上跑 DFS/BFS,把相邻的 1 连成一片,数有几片。这里结构换成了树,但核心完全一样:相邻关系从"网格的上下左右"变成了"树的父子边"。

所以算法是:遍历所有节点,遇到一个值为 1 且没访问过的节点,就从它出发把整片连通的 1(只沿父子边、且邻居也是 1)全部标记访问,island 计数加一。0 节点天然成为分隔,把不同的 1 连通块切开。

下面用邻接表表示树,val[u] 是节点 u 的 0/1 值:

def count_islands(adj, val, root):
    visited = set()
    islands = 0

    def dfs(u):
        visited.add(u)
        for v in adj[u]:
            if v not in visited and val[v] == 1:
                dfs(v)              # 只沿 1-1 的边扩张

    # 遍历所有节点,确保每个 1-连通块只被起算一次
    for u in adj:
        if u not in visited and val[u] == 1:
            islands += 1
            dfs(u)
        else:
            visited.add(u)          # 0 节点也标记,避免重复检查
    return islands
#        1(1)
#       /    \
#     2(1)   3(0)
#     /        \
#   4(0)       5(1)
adj = {1: [2, 3], 2: [1, 4], 3: [1, 5], 4: [2], 5: [3]}
val = {1: 1, 2: 1, 3: 0, 4: 0, 5: 1}
print(count_islands(adj, val, 1))   # 2:{1,2} 一片,{5} 一片

时间复杂度:O(V + E)(每节点、每条边各访问一次;树里 E = V−1,即 O(V))。空间复杂度:O(V)(visited + 递归栈)。

提示:树很深时递归会爆栈,临场可以提一句"可改成显式栈的迭代 DFS",面试官通常很买账。

四、临场提醒


FAQ

Q1:树状岛屿和网格岛屿有什么区别?

核心算法一样,都是对连通的 1 做 DFS/BFS 计数。区别只在相邻关系:网格是上下左右,树是父子边。把遍历的邻居来源换掉即可,0 节点依然充当分隔。

Q2:为什么遍历时也要标记 0 节点?

0 节点也加入 visited,可以避免外层循环对它重复检查;它本身不属于任何岛屿,标记后逻辑更干净,也不影响计数。

Q3:树很深会有什么问题?

递归 DFS 在极深的树上可能爆栈。可以改成用显式栈的迭代 DFS,或限制递归深度。面试时主动提这个点,能体现你对边界的敏感度。

Q4:Google NG 编程轮怎么高效准备?

按图与树遍历、连通块 / 并查集、前缀和 / 哈希、DP 分专题刷,每类限时练并口头讲思路。需要按 Google NG 题型做限时 mock、逐题讲解或 VO辅助 / VO代面 全程对接,可以走下面的路径定制。


正在准备 Google NG 面试?

Google NG 编程轮爱考经典题变体,吃的是迁移能力和清晰表达。oavoservice 提供 Google 全流程陪练:图与树遍历 / 连通块 / 前缀和 / DP 高频题限时模拟,拆题与口头表达逐题打磨,按 NG 校招题型做预测。教练含大厂资深工程师,支持 VO辅助 / VO代面 全程对接。

立即添加微信 Coding0201获取 Google 真题与陪练

联系方式