解题思路
- 从根节点开始遍历树。
- 在找到 p 和 q 之前,将父指针存储在Map<TreeNode,TreeNode> fatherMap。
- 使用fatherMap获得 p 的所有祖先,并添加到一个称为祖先的集合中。
- 同样遍历节点 q 的祖先。如果祖先存在于为 p 设置的祖先中,这意味着这是 p 和 q 之间的最近共同祖先(同时向上遍历)
算法效率有点低,有时间再改进吧
解题代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public void FindAncestor(TreeNode root,Map<TreeNode,TreeNode> fatherMap, TreeNode p, TreeNode q) {
//记录当前最近的公共祖先
if(fatherMap.containsKey(p)&&fatherMap.containsKey(q)){
return;
}
else {
TreeNode leftnode = root.left;
if (leftnode != null) {
fatherMap.put(leftnode, root);
FindAncestor(leftnode, fatherMap, p, q);
}
TreeNode rightnode = root.right;
if (rightnode != null) {
fatherMap.put(rightnode, root);
FindAncestor(rightnode, fatherMap, p, q);
}
}
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
Map<TreeNode,TreeNode> fatherMap = new HashMap<>();
FindAncestor(root,fatherMap,p,q);
Set<TreeNode> pNodeSet = new HashSet<>();//存储p的所有父节点
while(p != null){
pNodeSet.add(p);
p = fatherMap.get(p);
}
while(!pNodeSet.contains(q)){
//检测q的父节点是否是p的祖先结点
q = fatherMap.get(q);
}
return q;
}
}