给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof
说明:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉树中
这种递归思考了一哈才想清楚.相当于一种回溯,一直往下找节点,啥也没找到就返回null,找到了就返回该节点,返回的时候一层一层往祖先上返回.
这个结构从3开始 root=3,left=l(5,7,4)
root = 5,left = l(6,7,4)
root=6,left = None right = None 回溯到root=5 left=None
root=5, right = l(2,7,4)
root = 2,left = l(7,7,4)=7 right =l(4,7,4)=4 当left,right 都有值时,返回root 返回2
root=5,right = 2 left=None 返回有值的2
root=3 ,left=2,right懒得写了反正是None.所以公共节点None
整体来说就是一开始遍历往下找到节点,用left,right来存
如果left和right都没找到返回None,只有left或right找到了就把一个返回给上一层root,一直返回给第一层根
两个都有就返回上一层的root到再上一层.
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
if not root or root == p or root == q: return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if not left: return right
if not right: return left
return root
代码来源:作者:jyd 链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/solution/mian-shi-ti-68-ii-er-cha-shu-de-zui-jin-gong-gon-7/