📌  相关文章
📜  O(1)空间中给定两个节点之间的树的有序序列中的公共节点(1)

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

寻找两个节点之间的树的有序序列中的公共节点

问题描述:

现有一棵二叉搜索树(Binary Search Tree),请实现一个函数,返回树中两个指定节点之间的路径上的公共节点。

要求:

  • 不能使用递归。
  • 空间复杂度为 O(1)。
解决思路:
  • 首先对两个节点进行比较得到它们的大小关系,假设p1是较小的节点。

  • 从根节点开始遍历,如果当前节点的值小于p1的值,就移动到当前节点的右子树;如果大于p1的值,则移动到当前节点的左子树。

  • 不断重复上述操作,直到找到一个节点,它的值既大于等于p1的值,又小于等于p2的值。该节点即为所求的公共节点。

代码实现:
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if p.val > q.val:
            p, q = q, p   # 保证p的值小于q的值

        while root:
            if root.val < p.val:
                root = root.right
            elif root.val > q.val:
                root = root.left
            else:
                return root
复杂度分析:
  • 时间复杂度:O(log N),其中 N 是二叉搜索树中的节点数。在最坏的情况下,程序会遍历数的高度,因此时间复杂度为 O(log N)。

  • 空间复杂度:O(1),因为没有利用到额外的空间,只存储了当前节点的指针。