236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先
在这里插入图片描述
思路:

  1. 找到p、q节点的路径
  2. 路径中最后一个相同节点就是最近公共祖先的值,如root=3 p=5 q=1,两个路径[3,5] [3,1],公共祖先的值就是【3】
# Definition for a binary tree node.
# 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':
        # p、q节点路径保存到2个列表中,这两个列表中最后一个相同元素即是最近公共祖先
        
        self.result = [] # 记录所有根节点到叶子节点的路径
        self.cur_path = [] # 当前路径
        self.traverse(root, p, q)
        # 找到两个列表中最后一个相同元素
        for i in range(min(len(self.result[0]),len(self.result[1]))):
            if self.result[0][i] == self.result[1][i]:
                cur_node = self.result[0][i]
            else:
                break
        return cur_node

    def traverse(self, cur_node, p, q):
        # 遍历二叉树,找到二叉树路径
        if not cur_node:
            return 

        self.cur_path.append(cur_node)
        if p.val == cur_node.val or q.val == cur_node.val:
            self.result.append(self.cur_path[:])

        self.traverse(cur_node.left, p, q)
        self.traverse(cur_node.right, p, q)
        # 往回返的时候要从self.path中拿掉 因为既然回去了 就不能算走过的路径了 
        self.cur_path.pop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值