题解 | #第一个只出现一次的字符#
在二叉树中找到两个节点的最近公共祖先
http://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /** * * @param root TreeNode类 * @param o1 int整型 * @param o2 int整型 * @return int整型 */ public int lowestCommonAncestor (TreeNode root, int o1, int o2) { //map用于存放<子节点的值,父节点的值> Map<Integer,Integer> parent = new HashMap<>(); //队列用于遍历所有节点 Queue<TreeNode> que = new LinkedList<>(); //给root一个初始值,因为没有父节点 parent.put(root.val,Integer.MIN_VALUE); //将root添加到队列,开始遍历 que.add(root); //遍历树,直到找到o1和o2 while(!parent.containsKey(o1) || !parent.containsKey(o2)){ //先进先出,从队列中第一个节点开始,依次出队遍历左右子树 TreeNode node = que.poll(); //若节点的左孩子非空,则记录其与父节点的值到map,即<左孩子值,当前节点值> //同时将左孩子添加到队列准备遍历 if(node.left != null){ parent.put(node.left.val,node.val); que.add(node.left); } //右孩子同左孩子 if(node.right!=null){ parent.put(node.right.val,node.val); que.add(node.right); } } //从map中查询,并记录o1的所有父节点和祖先节点,添加到set中 Set<Integer> ancestor = new HashSet<>(); while(parent.containsKey(o1)){ ancestor.add(o1); //获取o1的父节点,继续遍历 o1 = parent.get(o1); } //查看o1和他的祖先节点是否包含o2节点,直到找到交叉点,即为所求 while(!ancestor.contains(o2)){ o2 = parent.get(o2); } return o2; } }