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

Google NG 0611 面经
Candidate 在 Google NG coding 环节遇到了经典题 —— 二叉树距离K节点。
今天面试官是一个资深工程师,看起来比较专业,先是双方自我介绍,然后直接就是 Coding,上来就出一道经典的 BFS 题。
题目描述
给一个二叉树根节点,目标节点 target,和一个 k,返回所有和目标节点距离 k 的节点。
解题思路
这是一道经典的图论 BFS问题,关键在于将二叉树转化为无向图:
- 构建无向图:将二叉树转化为无向图,每个节点可以访问其父节点和子节点
- BFS 搜索:从目标节点开始,进行 BFS 搜索,记录距离
- 距离判断:当距离等于 k 时,将节点加入结果集
- 避免重复访问:使用 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!