代码实现:
- 利用了map集合的kv特性
- 利用了set的不可重复特性
- 使用队列进行层次遍历
import java.util.*;
public class Solution {
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
//创建一个map存放本节点和其父节点
Map<Integer,Integer> parent = new HashMap<>();
//创建一队列进行层次遍历
Queue<TreeNode> queue = new LinkedList<>();
//根节点没有父节点用nmin代替
parent.put(root.val,Integer.MIN_VALUE);
//放入队列
queue.add(root);
//当map中有o1和o2的key则跳出循环
while(!parent.containsKey(o1) || !parent.containsKey(o2)){
TreeNode p = queue.poll();
if(p.left != null){
parent.put(p.left.val,p.val);
queue.add(p.left);
}
if(p.right != null){
parent.put(p.right.val,p.val);
queue.add(p.right);
}
}
//创建一个set放父节点
Set<Integer> set = new HashSet<>();
//把o1和其父节点放入set
while(parent.containsKey(o1)){
set.add(o1);
//拿的是o1的祖节点
o1 = parent.get(o1);
}
//判断set是否包含o2,不相等就看o2的父节点
while(!set.contains(o2))
//取o2的父节点
o2 = parent.get(o2);
return o2;
}
}