- 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
使用字典存储父亲节点
遍历树寻找所有节点的父亲节点构造{node : parent}字典
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
dic = {root:None}
def parents(node):
if node:
if node.left:
dic[node.left] = node
if node.right:
dic[node.right] = node
parents(node.left)
parents(node.right)
parents(root)
l1, l2 = p, q
while(l1!=l2):
l1 = dic.get(l1, q)
l2 = dic.get(l2, p)
return l1
Python 字典(Dictionary)
get() :
函数返回指定键的值,如果值不在字典中返回默认值。
最后的一个while, 很妙!记公共祖先节点是A,整棵树的根节点为root, P、Q距离A的步数分别是:a、b步,A距离root距离是c步, 那么P沿着父节点方向往上走a+c步就到达root节点(此时返回到Q),这时候让P再沿着Q到A的路径走b步,就停在A处,此时P的路程是a+c+b;同样的方法,Q的路程是b+c+a。 发现两者同时走到A,即判定条件 l1l2时要跳出循环。另外,如果ab的话,那么P,Q不用完全走完就会相遇。
递归
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if root==None or root==p or root==q:
return root
left=self.lowestCommonAncestor(root.left,p,q)
right=self.lowestCommonAncestor(root.right,p,q)
if left!=None:
if right==None:
return left
else:
return root
else:
return right