Google NG 面试经验分享:二叉树距离K节点 BFS题 - Oavoservice

2025-06-11
Google NG 面试经验分享:二叉树距离K节点 BFS题 - Oavoservice 封面

Google NG 0611 面经

Candidate 在 Google NG coding 环节遇到了经典题 —— 二叉树距离K节点

今天面试官是一个资深工程师,看起来比较专业,先是双方自我介绍,然后直接就是 Coding,上来就出一道经典的 BFS 题。

题目描述

给一个二叉树根节点,目标节点 target,和一个 k,返回所有和目标节点距离 k 的节点。

解题思路

这是一道经典的图论 BFS问题,关键在于将二叉树转化为无向图:

  1. 构建无向图:将二叉树转化为无向图,每个节点可以访问其父节点和子节点
  2. BFS 搜索:从目标节点开始,进行 BFS 搜索,记录距离
  3. 距离判断:当距离等于 k 时,将节点加入结果集
  4. 避免重复访问:使用 visited 集合避免重复访问

代码实现

from collections import deque

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def distanceK(root, target, k):
    # 构建父节点映射
    parent_map = {}
    
    def build_parent_map(node, parent):
        if not node:
            return
        parent_map[node] = parent
        build_parent_map(node.left, node)
        build_parent_map(node.right, node)
    
    build_parent_map(root, None)
    
    # BFS 搜索距离为 k 的节点
    queue = deque([(target, 0)])  # (node, distance)
    visited = {target}
    result = []
    
    while queue:
        node, distance = queue.popleft()
        
        if distance == k:
            result.append(node.val)
        elif distance < k:
            # 访问左子节点
            if node.left and node.left not in visited:
                visited.add(node.left)
                queue.append((node.left, distance + 1))
            
            # 访问右子节点
            if node.right and node.right not in visited:
                visited.add(node.right)
                queue.append((node.right, distance + 1))
            
            # 访问父节点
            if parent_map[node] and parent_map[node] not in visited:
                visited.add(parent_map[node])
                queue.append((parent_map[node], distance + 1))
    
    return result

算法分析

  • 时间复杂度:O(n),其中 n 是树中节点的数量
  • 空间复杂度:O(n),用于存储父节点映射和 BFS 队列
  • 核心思想:将二叉树转化为无向图,使用 BFS 进行距离搜索

测试用例

# 测试代码
# 构建测试树
#       3
#      / \
#     5   1
#    / \ / \
#   6  2 0  8
#     / \
#    7   4

root = TreeNode(3)
root.left = TreeNode(5)
root.right = TreeNode(1)
root.left.left = TreeNode(6)
root.left.right = TreeNode(2)
root.right.left = TreeNode(0)
root.right.right = TreeNode(8)
root.left.right.left = TreeNode(7)
root.left.right.right = TreeNode(4)

target = root.left  # 节点5
k = 2
result = distanceK(root, target, k)
print(f"距离节点{target.val}为{k}的节点: {result}")  # 输出: [7, 4, 1]

优化版本

可以使用更简洁的实现方式:

def distanceK_optimized(root, target, k):
    # 构建邻接表
    graph = {}
    
    def build_graph(node, parent):
        if not node:
            return
        if node not in graph:
            graph[node] = []
        if parent:
            graph[node].append(parent)
            graph[parent].append(node)
        build_graph(node.left, node)
        build_graph(node.right, node)
    
    build_graph(root, None)
    
    # BFS 搜索
    queue = deque([(target, 0)])
    visited = {target}
    result = []
    
    while queue:
        node, distance = queue.popleft()
        
        if distance == k:
            result.append(node.val)
        elif distance < k:
            for neighbor in graph.get(node, []):
                if neighbor not in visited:
                    visited.add(neighbor)
                    queue.append((neighbor, distance + 1))
    
    return result

面试官看完直接点头:"Excellent solution! The graph approach is very clean."

Candidate 成功拿下这一轮。

这就是 OAVOSERVICE 实时 VO 辅助 的威力:

不是死记硬背题库,而是帮你在最关键的时刻,快速理清思路,稳定发挥,稳稳过关!

面试技巧分享

在 Google NG 的面试中,除了算法实现,面试官还会关注:

1. 问题建模能力

能够快速识别出这是一道图论问题,将二叉树转化为无向图进行搜索。

2. 数据结构选择

合理选择数据结构(队列、哈希表)来高效实现 BFS 算法。

3. 边界条件处理

考虑各种边界情况,如空树、k=0、目标节点不存在等。

4. 代码优化

能够提供多种实现方案,展示对算法的深度理解。

Oavoservice 实时辅助服务

在这次 Google NG 面试中,我们的实时辅助系统发挥了关键作用:

  • 快速思路提示:在候选人卡壳时,立即提供图论转换的核心思路
  • 算法指导:推荐使用 BFS 来实现距离搜索算法
  • 代码优化:提供最优的代码实现,确保时间和空间复杂度
  • 边界处理:帮助候选人考虑各种边界情况和异常处理

结语

二叉树距离K节点虽然是一道经典题目,但在面试的紧张环境下,能够快速理清思路并正确实现并不容易。这就是为什么我们的实时辅助服务如此重要。

如果你正在准备 Google 或其他公司的技术面试,欢迎联系 Oavoservice。我们拥有丰富的面试经验和专业的辅助团队,能够在你最需要的时候提供及时有效的帮助。

Oavoservice - 让每一次面试都成为成功的机会!

需要辅助的同学随时dd哦,vo开始前支持mock!