如何获取公共祖先?
要获取公共祖先,首先要获得根节点目标节点的路径,要获取路径就需要遍历二叉树将沿途的节点加入路径数组中,而二叉搜索树是有序的,可以根据节点的大小关系选择指针遍历,而不需要循环遍历,因为路径都是从根节点出发,所以两个目标节点的最远公共祖先是根节点,最近目标节点为两个目标节点的路径中最后一个相同的节点。
参考
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param p int整型
* @param q int整型
* @return int整型
*/
private ArrayList<Integer> getPath(TreeNode root, int target) {
ArrayList<Integer> path = new ArrayList<>();
TreeNode node = root;
// 节点值都不同,可以用值比较判断循环
// 二叉搜索树不需要递归找路径
while(node.val != target) {
path.add(node.val);
if (target < node.val) {
node = node.left;
}
else {
node = node.right;
}
}
path.add(node.val);
return path;
}
public int lowestCommonAncestor (TreeNode root, int p, int q) {
// write code here
ArrayList<Integer> pathP = getPath(root, p);
ArrayList<Integer> pathQ = getPath(root, q);
int res = 0;
for (int i = 0; i < pathP.size() && i < pathQ.size(); ++i) {
int x = pathP.get(i);
int y = pathQ.get(i);
// 最后一个相同的点就是最近公共祖先
if (x == y) {
res = pathP.get(i);
}
else {
break;
}
// 如果换成以下写法就过不了最后一个用例,不知道为什么
// if (pathP.get(i) == pathQ.get(i)) {
// res = pathP.get(i);
// }
}
return res;
}
}



京公网安备 11010502036488号