📅  最后修改于: 2023-12-03 15:21:40.103000             🧑  作者: Mango
在一棵二叉树中,每个节点都有一个父节点,除了根节点。我们可以通过给每个节点增加一个指向其父节点的指针来获取其父节点。现在请你实现一个函数,用来寻找二叉树中节点的第 K 个祖先。
首先,我们可以使用递归的方式来查找所有祖先节点,并放到一个列表中保存。然后我们只需返回列表中倒数第 K 个节点即为所求的第 K 个祖先节点。代码如下:
class TreeNode:
def __init__(self, val=0, left=None, right=None, parent=None):
self.val = val
self.left = left
self.right = right
self.parent = parent
def find_kth_ancestor(root, target, K):
path = []
def dfs(node):
if not node:
return False
# 找到目标节点,返回 True
if node == target:
path.append(node)
return True
# 在左子树或右子树中查找目标节点,返回 True
if dfs(node.left) or dfs(node.right):
path.append(node)
return True
return False
dfs(root)
if K > len(path) - 1:
return None
return path[-K-1]
类似于后序遍历的迭代方法,我们可以使用栈来模拟递归过程。我们从根节点开始遍历二叉树,当遇到目标节点时,将目标节点和其祖先节点依次压入栈中。当栈的长度大于等于 K 时,取出栈中倒数第 K 个节点即为所求。
def find_kth_ancestor(root, target, K):
stack = []
node = root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack[-1]
if node.right and node.right != target and node.right not in stack:
node = node.right
continue
if node == target or (not node.right and node.left == target):
if len(stack) >= K:
return stack[-K]
node = None
continue
stack.pop()
node = None
return None
以上就是寻找二叉树中节点的第 K 个祖先的两种方法,分别使用了递归和迭代两种方式,其中迭代方法是通过栈来模拟递归实现的。