236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
1 | 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 |
示例 2:
1 | 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 |
说明:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉树中。
思路一
我们可以遍历所有结点,并判断 p 或 q 是否在它的左右子树上,或者这个结点就是 p 或 q 。定义 fx表示 x 结点的子树中是否包含 p 节点或 q节点。fl 代表 x 结点的左子树上是否有 p 或 q 结点,fr 代表 x 结点的右子树上是否有 p 或 q 结点。我们有两种情况:
- p 和 q 分别在 x 结点的左右子树上,即 fl && fr == true
- 结点 x 就是 p 或 q,此时 x== p || x==q 为true,若在 x 结点的左子树或右子树上找到另一个结点,则 x 就是最近公共祖先。
总结判断条件:(f1 && fr) || [ (x==p || x==q) && ( fl || fr) ] 。由于是自底向上判断的,在所有满足条件的公共祖先中一定是深度最大的祖先被访问到。
1 | /** |