LeetCode: 009-Lowest Common Ancestor of a Binary Search Tree

本文深入探讨了在二叉树结构中查找两个节点的最近公共祖先的问题,从构建父子关系列表到使用字典加速搜索过程,详细介绍了算法实现与优化。同时指出错误在于求交操作的实现,并提供了修正后的代码实现,确保了正确性和效率。

Lowest Common Ancestor of a Binary Search Tree

找出二叉树中某两个节点的最近的祖先. 可以是节点本身.

思路

一个快速的解决方案
- 首先依赖搜索算法构建整个二叉树的父子关系列表
- 回溯寻找父亲关系图, 需要检索关系列表, 所以考虑用dict会快一些

我的解法

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        """
        使用DFS实现
        """
        stack = [(None, root)] #(parent, node_now)
        relation = {}
        for parent, node in stack:
            relation[node] = parent
            if node.left != None:
                stack.append((node, node.left))
            if node.right != None:
                stack.append((node, node.right))
        # 父子关系构建完毕
        ancestor_p, ancestor_q = [p], [q]
        for i in ancestor_p:
            if relation[i] == None:
                break
            ancestor_p.append(relation[i])
        for i in ancestor_q:
            if relation[i] == None:
                break
            ancestor_q.append(relation[i])
        # 貌似不能这样求交, 在我的电脑上是可以的
        return zip(ancestor_p[::-1], ancestor_q[::-1])[-1][0]

今天有些头晕..
实际上如果上面的解法可以通过的话,
它是另外一道题的答案:
No.236 Lowest Common Ancestor of a Binary Tree

暂时想不出来错误在哪里….等会再改吧.

补充内容

因为我把二叉搜索树的题做成二叉树了…
需要补充二叉搜索树的内容. (留坑待填)

有个严重的错误

求交那里写错了. 交换顺序后结果并不对.
用基本循环逻辑重新实现了这一部分

class Solution(object):
    def lowestCommonAncestor(self, root, p, q):
        """
        使用DFS实现
        # 009 - 235. Lowest Common Ancestor of a Binary Search Tree
        """
        stack = [(None, root)] #(parent, node_now)
        relation = {}
        for parent, node in stack:
            relation[node] = parent
            if node.left != None:
                stack.append((node, node.left))
            if node.right != None:
                stack.append((node, node.right))
        # 父子关系构建完毕
        ancestor_p, ancestor_q = [p], [q]
        for i in ancestor_p:
            if relation[i] == None:
                break
            ancestor_p.append(relation[i])
        for i in ancestor_q:
            if relation[i] == None:
                break
            ancestor_q.append(relation[i])
        for i,j in zip(ancestor_p[::-1], ancestor_q[::-1])[::-1]:
            if i == j:
                break
        return i

虽然通过了, 确实难以令人开心.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值