📌  相关文章
📜  从根(或共同祖先)打印路径上的公共节点(1)

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

从根(或共同祖先)打印路径上的公共节点

在树结构中,我们经常需要找到两个节点的公共祖先或公共路径。本文将介绍一种从根或共同祖先开始打印路径上的公共节点的方法。

算法思路
  1. 先从根节点开始遍历,将目标节点的路径保存下来;
  2. 对于另一个目标节点,从根节点开始遍历,不断找到与第一个节点路径相交的节点即为公共节点;
  3. 依次打印公共节点即可。

具体实现步骤如下:

代码实现
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        path_p, path_q = [], []
        self.dfs(root, p, path_p)
        self.dfs(root, q, path_q)
        n = min(len(path_p), len(path_q))
        for i in range(n):
            if path_p[i] != path_q[i]:
                return path_p[i-1]
        return path_p[n-1]

    def dfs(self, root, target, path):
        if root == target:
            path.append(root)
            return True
        if not root:
            return False

        path.append(root)
        if self.dfs(root.left, target, path):
            return True
        if self.dfs(root.right, target, path):
            return True

        path.pop()
        return False
复杂度分析
  • 时间复杂度:$\mathcal{O}(n)$,其中 $n$ 为二叉树节点数。最坏情况下,需要遍历一次所有的节点才能找到公共祖先。
  • 空间复杂度:$\mathcal{O}(n)$,即为存储路径所需要的空间。