📜  数据结构|二叉搜索树|问题12(1)

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

数据结构 | 二叉搜索树 | 问题12

介绍

本问题涉及到二叉搜索树中查找两个节点的最近公共祖先。二叉搜索树是一种特殊的二叉树,它满足如下性质:

  • 左子树上所有节点的值均小于根节点的值
  • 右子树上所有节点的值均大于根节点的值
  • 左子树和右子树也分别满足上述性质

在二叉搜索树中查找两个节点的最近公共祖先可以采用递归或迭代的方法实现。

问题描述

给定一棵二叉搜索树和两个节点p和q,查找它们的最近公共祖先节点(LCA)。假设输入的两个节点都存在于二叉搜索树中,并且每个节点的值都不同。

算法实现
递归算法

递归算法是一种自顶向下的算法,其核心思想是判断当前节点是否为最近公共祖先,如果不是则递归寻找左右子树中是否存在p和q节点。如果一个节点的左右子树中分别存在p和q节点,那么该节点就是它们的最近公共祖先。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:
            return None
        
        if root.val > p.val and root.val > q.val:
            return self.lowestCommonAncestor(root.left, p, q)
        elif root.val < p.val and root.val < q.val:
            return self.lowestCommonAncestor(root.right, p, q)
        else:
            return root
迭代算法

迭代算法是一种自底向上的算法,其核心思想是利用二叉搜索树的性质,在树的深度优先搜索过程中寻找两个节点的路径,并最终找到它们的最近公共祖先。

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        stack = [root]
        parent = {root: None}
        
        while p not in parent or q not in parent:
            node = stack.pop()
            
            if node.left:
                parent[node.left] = node
                stack.append(node.left)
            
            if node.right:
                parent[node.right] = node
                stack.append(node.right)
        
        ancestors = set()
        
        while p:
            ancestors.add(p)
            p = parent[p]
        
        while q not in ancestors:
            q = parent[q]
        
        return q 
总结

本问题的算法实现方法有两种,递归算法和迭代算法。它们的时间复杂度均为O(h),其中h是树的高度。需要注意的是,本问题假设输入的两个节点都存在于二叉搜索树中,并且每个节点的值都不同。如果不满足这些条件,需要对算法进行相应的修改。