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;}
}