- 二叉树的最近公共祖先
思路总结:
这个题目的思路很好,不是我常见的想法
他是什么,找到两个节点最近公共祖先
在最近的公共祖先后面的所有都是他的祖先
怎么想的:一个节点只会有一个父节点,两个节点可能是这个样子的
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
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:
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