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

  1. 二叉树的最近公共祖先
思路总结:
	这个题目的思路很好,不是我常见的想法
	他是什么,找到两个节点最近公共祖先
	在最近的公共祖先后面的所有都是他的祖先

	怎么想的:一个节点只会有一个父节点,两个节点可能是这个样子的
	0->0->0->0
	也可能是这样的
	0->0->0->0    分叉了
		  |
		  ^
		  0	
	所以就是把所有节点的父节点通过字典记录,然后将p从下往上进行遍历
	找到对应的一条线
	然后再遍历q,每次进行一个查找
	
    
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':

        dic={}
        xianxu(root,dic)
        dic[root]=root

        cur=p
        set_p={}
        while cur!=dic.get(cur):#就是说除了根节点以外,其他节点的父节点不可能为其本身
            set_p[cur]=0
            cur=dic.get(cur)
        cur=q
        while cur!=dic.get(cur):
            if cur in set_p:
                return cur
            cur=dic.get(cur)
        return root

def xianxu(x,dic):
    '''
        先序遍历,获得所有节点父节点
    :param x:
    :return:
    '''
    if x==None:
        return  #基本结束条件
    if x.left:
        dic[x.left]=x   #key为                                                                                            当前节点  value为对应的父节点,会存在None的情况,不需要管他
    if x.right:
        dic[x.right]=x

    xianxu(x.left,dic)
    xianxu(x.right,dic)
def fun2(root,o1,o2):
    '''
        1.o1是o2的最低公共祖先,或o2是o1的最低公共祖先
        2.o1与o2不互为最低公共祖先,需要向上寻找

        基本思路:
            首先在具有o1,或o2的时候对其进行返回(就是说一碰到o1或o2就返回,不会往下面走了)
            如果没有o1或者o2就返回None
            这样的话如果在当前节点中  有left没有right说明什么?
                说明当前节点的左树上(直接连接处)遇到了o1或o2,并且他的右边没有  所以是情况1直接返回
            同样没有left有right 也是情况1

            如果都是None应该返回什么,同样返回None,因为证明以当前节点为根节点的树上没有o1或o2
            如果都不为空返回什么,返回当前的节点,他一定是最近公共祖先
    :param root:
    :param o1:
    :param o2:
    :return:
    '''
    if root==None or root==o1 or root==o2:  #基本结束条件,如果在这个树里面没有o1,o2一定会返回None
        return root
    left=fun2(root.left,o1,o2)
    right=fun2(root.right,o1,o2)
    if left!=None and right==None:
        return left
    if left==None and right!=None:
        return right
    if left!=None and right!=None:
        return root
    if left==None and right==None:
        return None
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值