返回
逐一击破,步步为“赢”!《二叉树中所有距离为K的结点》巧解之法
前端
2023-11-29 13:40:03
## 算法概述:
本题的关键在于寻找距离目标结点为K的结点,可以使用深度搜索或广度搜索来实现。
1. 深度搜索:
- 从目标结点开始,深度优先搜索整棵树。
- 对于每个结点,记录其与目标结点的距离。
- 如果距离等于K,则将该结点添加到结果列表中。
2. 广度搜索:
- 从目标结点开始,广度优先搜索整棵树。
- 对于每个结点,记录其与目标结点的距离。
- 如果距离等于K,则将该结点添加到结果列表中。
## 深度搜索算法实现:
```python
def distanceK(root, target, K):
"""
:type root: TreeNode
:type target: TreeNode
:type K: int
:rtype: List[int]
"""
# 找到目标结点
target_node = find_target(root, target)
# 深度搜索从目标结点开始
result = []
dfs(target_node, K, result)
return result
def find_target(root, target):
"""
找到目标结点
"""
if root is None:
return None
if root.val == target:
return root
left = find_target(root.left, target)
right = find_target(root.right, target)
return left or right
def dfs(node, K, result):
"""
深度搜索从目标结点开始
"""
if node is None:
return
# 如果距离等于K,则将该结点添加到结果列表中
if K == 0:
result.append(node.val)
return
# 继续搜索子树
dfs(node.left, K - 1, result)
dfs(node.right, K - 1, result)
广度搜索算法实现:
def distanceK(root, target, K):
"""
:type root: TreeNode
:type target: TreeNode
:type K: int
:rtype: List[int]
"""
# 找到目标结点
target_node = find_target(root, target)
# 广度搜索从目标结点开始
result = []
queue = [(target_node, 0)]
visited = set()
while queue:
node, distance = queue.pop(0)
# 如果距离等于K,则将该结点添加到结果列表中
if distance == K:
result.append(node.val)
continue
# 如果结点没有被访问过
if node not in visited:
visited.add(node)
# 将相邻的结点添加到队列中
if node.left is not None:
queue.append((node.left, distance + 1))
if node.right is not None:
queue.append((node.right, distance + 1))
if node.parent is not None:
queue.append((node.parent, distance + 1))
return result
def find_target(root, target):
"""
找到目标结点
"""
if root is None:
return None
if root.val == target:
return root
left = find_target(root.left, target)
right = find_target(root.right, target)
return left or right
算法分析:
-
时间复杂度:
- 深度搜索算法的时间复杂度为O(N),其中N是二叉树中的结点数。
- 广度搜索算法的时间复杂度为O(N),其中N是二叉树中的结点数。
-
空间复杂度:
- 深度搜索算法的空间复杂度为O(N),其中N是二叉树中的结点数。
- 广度搜索算法的空间复杂度为O(N),其中N是二叉树中的结点数。
不同方法的比较:
方法 | 时间复杂度 | 空间复杂度 | 优缺点 |
---|---|---|---|
深度搜索 | O(N) | O(N) | 容易实现,但效率较低 |
广度搜索 | O(N) | O(N) | 效率较高,但实现难度较大 |
总结:
本文介绍了如何使用深度搜索和广度搜索两种算法来解决 LeetCode 上的 863. 二叉树中所有距离为 K 的结点问题。还讨论了不同方法的优缺点,以及如何选择最适合自己的方法。希望本文对您有所帮助。