把p的所有祖先找出来,把q的所有祖先找出来,因为是是搜索树,找出来的祖先都是排好序的,所以可以把找出来的祖先从后面往前面遍历,第一个相同的值的数就是最近的公共祖先,这是我一开始的想法,但是它最后报错了
它的意思是后面没有元素?不知道,看了题解,题解是从前往后比,因为他们前面的祖先都是一样的,所以他们最近的公共祖先就是最后一个相同的值的节点。
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
List<TreeNode> pathp = getPath(root, p);
List<TreeNode> pathq = getPath(root, q);
TreeNode ancestor = null;
for( int i = 0; i<pathp.size() && i<pathq.size(); i++ ){
if(pathp.get(i) == pathq.get(i)){
ancestor = pathp.get(i);
}else{
break;
}
}
return ancestor;
}
private List<TreeNode> getPath(TreeNode root, TreeNode target){
List<TreeNode> path = new LinkedList<TreeNode>();
while(root.val != target.val){
path.add(root);
if(target.val > root.val){
root = root.right;
}else if(target.val < root.val){
root = root.left;
}
}
path.add(root);
return path;
}
}
找出祖先的办法就是从根节点往下找,如果这个目标节点小于根节点说明,目标节点在根节点的左子树,然后再把根节点移到左子树的根节点上,右子树同理,把这些都放到一个List里面,最后返回这个List,比的话就是从前面往后面比因为他们前面都是一样的所以只要返回最后一个相同的就行,还要注意的就是List里面放TreeNode而不是Integer因为最后返回的是Treenode,但是为什么没有.val却输出了值,应该是重写了toString方法,我也不太明白。