二叉树最近公共祖先dfs
时间: 2023-08-23 17:07:53 浏览: 136
二叉树的最近公共祖先可以通过深度优先搜索(DFS)来求解。DFS可以通过递归或者栈来实现,下面给出一种基于递归的实现方法:
首先,我们需要定义一个辅助函数来计算从根节点到目标节点的路径。然后,我们可以通过比较两个路径的公共部分来找到最近公共祖先。
以下是基于递归的实现代码:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def findPath(root, target, path):
if not root:
return False
path.append(root.val)
if root.val == target:
return True
if (root.left and findPath(root.left, target, path)) or (root.right and findPath(root.right, target, path)):
return True
path.pop()
相关问题
二叉树最近公共祖先dfs非递归
非递归实现DFS可以通过使用栈来模拟递归的过程。以下是基于栈的非递归实现代码:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def findPath(root, target):
stack = [(root, [root.val])]
while stack:
node, path = stack.pop()
if node.val == target:
return path
if node.right:
stack.append((node.right, path + [node.right.val]))
if node.left:
stack.append((node.left, path + [node.left.val]))
def lowestCommonAncestor(root, p, q):
path_p = findPath(root, p)
path_q = findPath(root, q)
i = 0
while i < len(path_p) and i < len(path_q) and path_p[i] == path_q[i]:
i += 1
return path_p[i-1]
```
在上述代码中,我们使用一个栈来模拟DFS的过程。初始时,将根节点和从根节点到根节点的路径作为初始的元组压入栈中。然后,循环从栈中弹出节点,并检查当前节点是否为目标节点。如果是目标节点,则返回当前路径。否则,将当前节点的子节点压入栈中,并更新路径。最后,我们找到两个目标节点的路径后,比较路径的公共部分,返回最近公共祖先的值。
注意:上述代码中的 `lowestCommonAncestor` 函数是调用 `findPath` 函数来获取两个目标节点的路径,并比较路径的公共部分来找到最近公共祖先的值。
数据结构二叉树祖先和后代
二叉树中的“祖先”是指在树中位于另一个节点上方的节点,而“后代”则是指那个节点下方的所有节点,包括直接子节点以及子节点的子节点。在二叉搜索树中,这个问题通常涉及到查找两个给定节点之间的路径,比如找出某个节点A的所有祖先节点B(除了A自身),或者找到所有从根到节点B的路径经过节点A。
例如,在一棵二叉树中,如果节点P是节点Q的祖先,那么从根到Q的路径上会包含节点P。反过来,如果节点R是节点Q的后代,那么节点Q存在于从根到R的路径上。
在实际操作中,可以采用深度优先搜索(DFS)或者层次遍历的方式来进行查找。对于每个节点,检查它是否是目标节点的祖先或后代,如果是,则添加到结果集中,然后递归地对左子树和右子树继续这个过程。
阅读全文