打卡:求二叉树的最近公共祖先

10 篇文章 0 订阅

二叉树中大多数是从父节点向子节点遍历,例如回溯算法。而这个解法的重点,在于掌握树结构中,从子节点向上遍历父节点的方法。因为子节点没有父节点的信息。所以要构造一个数据,使得子节点包含父节点信息。
所以此处采用了map数据结构,将子节点映射到父节点。

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':
        root_map = {}

        def dfs(node):
            if node.left:
                root_map[node.left] = node
                dfs(node.left)
            if node.right:
                root_map[node.right] = node
                dfs(node.right)

        dfs(root)

        p_parent = []
        while p!=None:
            p_parent.append(p)
            p = root_map.get(p)
        while q!=None:
            if q in p_parent:
                return q
            q = root_map.get(q)
        


if __name__ == '__main__':
    root = TreeNode(3)
    node1 = TreeNode(5)
    node2 = TreeNode(1)
    node3 = TreeNode(6)
    node4 = TreeNode(2)
    node5 = TreeNode(0)
    node6 = TreeNode(8)
    node7 = TreeNode(7)
    node8 = TreeNode(4)
    root.left = node1
    root.right = node2
    node1.left = node3
    node1.right = node4
    node2.left = node5
    node2.right = node6
    node4.left = node7
    node4.right = node8

    res = Solution().lowestCommonAncestor(root,node1,node2)
    print(res.val)
    ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值