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

📅  最后修改于: 2023-12-03 14:54:56.750000             🧑  作者: Mango

数据结构 | 平衡二叉搜索树 | 问题13

简介

平衡二叉搜索树(Balanced Binary Search Tree,或称 BBST)是一种能够自动调整结构以保证平衡的二叉搜索树。平衡二叉搜索树的核心思想是通过旋转树的节点,保证任何节点左右子树的高度差不超过1,从而提高搜索、插入、删除等操作的效率。常见的平衡二叉搜索树有AVL树、红黑树、B树等。

问题13是指在平衡二叉搜索树中找到两个节点之间的最近公共祖先。

解决方案
方法1:暴力求解

暴力求解的思路很简单,先找到p和q的节点,然后从它们的路径中找到最后一个相同的节点即为它们的最近公共祖先。这里需要用到树的路径查找操作,时间复杂度为O(nlogn)。

class Solution:
    def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
        if not root: return None

        def getPath(root, target):
            path = []
            while root != target:
                path.append(root)
                if root.val > target.val:
                    root = root.left
                else:
                    root = root.right
            path.append(root)
            return path

        path_p = getPath(root, p)
        path_q = getPath(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]
方法2:优化求解

方法2可以在方法1的基础上进行优化,先利用BST的性质,找到两个节点的路径,并且不需要额外的数组来存储路径。然后,从两条路径的最后一个节点开始比较,最终返回它们的最近公共祖先。时间复杂度为O(logn)。

class Solution:
    def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
        if not root: return None

        def getPath(root, target):
            path = []
            while root != target:
                path.append(root)
                if root.val > target.val:
                    root = root.left
                else:
                    root = root.right
            path.append(root)
            return path

        path_p = getPath(root, p)
        path_q = getPath(root, q)

        i = len(path_p) - 1
        j = len(path_q) - 1

        while i >= 0 and j >= 0:
            if path_p[i] != path_q[j]:
                break
            i -= 1
            j -= 1

        return path_p[i+1]
总结

本篇介绍了平衡二叉搜索树的核心思想和常见的平衡二叉搜索树有AVL树、红黑树、B树等。并且给出了在平衡二叉搜索树中找到两个节点之间的最近公共祖先的两种解法,其中方法2的时间复杂度较优。