- 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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
本文介绍了一种寻找二叉树中两个指定节点最近公共祖先的有效算法。通过构造字典存储每个节点的父节点,利用递归或迭代方法,实现了快速定位最近公共祖先的目标。文章详细解释了算法原理,并提供了Python实现代码。
874

被折叠的 条评论
为什么被折叠?



