问题描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
示例
示例1
输入
[3,5,1,6,2,0,8,#,#,7,4],5,1
输出
3
解决思路
思路
- 深度优先搜索遍历:通过递归的方式深度优先搜索遍历,当发现节点的值与输入的值相等时返回节点,判断找到的左节点和右节点是否同时不为空,不为空则找到最近的公共祖先。
代码实现
// 思路1:深度优先搜索遍历
public class Solution {
public int lowestCommonAncestor(TreeNode root, int o1, int o2) {
TreeNode rs = lowestAcnestor(root, o1, o2);
return rs.val;
}
public TreeNode lowestAcnestor(TreeNode head, int o1, int o2) {
if (head == null) {
return head;
}
if (head.val == o1 || head.val == o2) {
return head;
}
//在左子树中查找目标节点
TreeNode left = lowestAcnestor(head.left, o1, o2);
//在右子树中查找目标节点
TreeNode right = lowestAcnestor(head.right, o1, o2);
if (left != null && right != null) {
return head;
}
return left != null ? left : right;
}
}
时间复杂度分析:
O(N):递归遍历二叉树
空间复杂度分析:
O(N):这里的空间复杂度取决于递归的深度,最快的情况下二叉树为一个链表
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试