如何获取公共祖先?
要获取公共祖先,首先要获得根节点目标节点的路径,要获取路径就需要遍历二叉树将沿途的节点加入路径数组中,而二叉搜索树是有序的,可以根据节点的大小关系选择指针遍历,而不需要循环遍历,因为路径都是从根节点出发,所以两个目标节点的最远公共祖先是根节点,最近目标节点为两个目标节点的路径中最后一个相同的节点。
参考
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; } }