目录
在二叉树中找到两个节点的最近公共祖先
描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
示例1
输入:
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回值:
3
备注
二叉树的数据结构如下:
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
}
方法:递归
两个节点 o1 , o2 的公共祖先只有三种情况:
- o1和o2分别位于公共祖先的两侧
- o1为祖先,o2位于o1的两侧
- o2为祖先,o1位于o2的两侧
那么我们就可以递归寻找o1和o2节点,当找到两个节点或者找到叶子节点的子结点也就是null值,那么我们就返回当前的根,
否则没找到就递归调用在当前节点的左右子树分别寻找o1和o2节点。
import java.util.*;
public class Solution {
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// write code here
TreeNode ancestor=findCommonAncestor(root,o1,o2);
return ancestor.val;
}
public TreeNode findCommonAncestor (TreeNode root, int o1, int o2) {
// write code here
if(root==null||root.val==o1||root.val==o2){
return root;//如果当前根找到了o1,o2,则返回当前根节点
}
TreeNode left=findCommonAncestor(root.left,o1,o2);//在当前根的左侧寻找o1,o2节点
TreeNode right=findCommonAncestor(root.right,o1,o2);//在当前根的右侧寻找o1,o2节点
if (left==null){
return right;//o1,o2都在右子树
}
if(right==null){
return left;//o1,o2都在左子树
}
return root;//o1,o2分别在左右子树
}
}
递归方法速度比较快,