题目地址(236. 二叉树的最近公共祖先)
https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
题目描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。示例 2:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4输出:5解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。示例 3:输入:root = [1,2], p = 1, q = 2输出:1提示:树中节点数目在范围 [2, 105] 内。-109 <= Node.val <= 109所有 Node.val 互不相同 。p != qp 和 q 均存在于给定的二叉树中。
前置知识
公司
- 暂无
思路

如果要找的是7和5的话 遇到7直接返回7 最后的结果就是7
找到 pq就返回pq 没找到就返回null 一边返回null就返回另一边 两边都不为null说明当前root就是最大的公共祖先
关键点
- 求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从低向上的遍历方式。
- 在回溯的过程中,必然要遍历整颗二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。
- 要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。
代码
- 语言支持:Java
Java Code:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class Solution {//递归的返回值 如果遇到qp就返回 参数就是节点和qppublic TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//递归中止条件 当root为以下三种情况就返回if (root == p || root == q || root == null) {return root;}//使用后序遍历TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);//情况1 当两边都为null 返回nullif (left == null && right == null) {return null;//当一边为空 返回另一边的节点} else if (left == null && right != null) {return right;} else if (left != null && right == null) {return left;//到这个位置就是两边都不为空的情况 返回root} else {return root;}}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=IBAYm)
- 空间复杂度:
#card=math&code=O%28n%29&id=eAmh6)
