236.二叉树的最近公共祖先
方法:使用哈希表存储父节点
利用哈希表存储所有节点的父节点,然后就可以利用节点的父节点信息从p节点开始不断向上跳,并记录已经访问过的节点,再从q节点开始不断向上跳,如果碰到已经访问过的节点,那么这个节点就是要找的最近公共祖先
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//使用哈希表存储所有节点的父节点
Map<Integer,TreeNode> parent = new HashMap<>();
Set<Integer> visited = new HashSet<>();
//使用哈希表存储所有节点的父节点
public void dfs(TreeNode root){
if(root.left != null){
parent.put(root.left.val,root);
dfs(root.left);
}
if(root.right != null){
parent.put(root.right.val,root);
dfs(root.right);
}
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
dfs(root);
while(p!=null){
visited.add(p.val);
p = parent.get(p.val); //从p节点开始不断查找其祖先节点
}
while(q!=null){
if(visited.contains(q.val)){
return q;
}
q = parent.get(q.val);
}
return null;
}
}