📌  相关文章
📜  二叉树中节点的第 K 个祖先(1)

📅  最后修改于: 2023-12-03 15:21:40.103000             🧑  作者: Mango

二叉树中节点的第 K 个祖先

在一棵二叉树中,每个节点都有一个父节点,除了根节点。我们可以通过给每个节点增加一个指向其父节点的指针来获取其父节点。现在请你实现一个函数,用来寻找二叉树中节点的第 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 个祖先的两种方法,分别使用了递归和迭代两种方式,其中迭代方法是通过栈来模拟递归实现的。