题目
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
题解:
由于每个节点只有唯一一个父节点,我们可以使用到字典的value-key的形式(节点-父节点)
字典中预置根节点的父节点为None。
字典建立完成后,二叉树就可以看成一个所有节点都将最终指向根节点的链表了。
于是在二叉树中寻找两个节点的最小公共节点就相当于,在一个链表中寻找他们相遇的节点
后面的思路可以参考力扣中这个题目的代码实现 160.相交链表
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
dic = {root:None}
def fath(node):
if node:
if node.left:
dic[node.left] = node
if node.right:
dic[node.right] = node
fath(node.left)
fath(node.right)
fath(root)
p1,q1 = p, q
while p1 != q1:
p1 = dic[p1] if p1 else q
q1 = dic[q1] if q1 else p
return p1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree