package com.interview.flag.a; import com.interview.basics.model.collection.hash.HashMap; import com.interview.leetcode.utils.TreeNode; /** * Created_By: stefanie * Date: 14-12-4 * Time: 下午5:53 */ public class A3_MinDistanceInTree { public static int minDistance(TreeNode root, TreeNode n1, TreeNode n2){ HashMap<Integer, Integer> depth = new HashMap<>(); depth(root, depth, 1); TreeNode commonAncestor = lowestCommonAncestor(root, n1, n2); if(commonAncestor == n1 || commonAncestor == n2){ return Math.abs(depth.get(n1.val) - depth.get(n2.val)); } else { return depth.get(n1.val) + depth.get(n2.val) - 2 * depth.get(commonAncestor.val); } } public static void depth(TreeNode node, HashMap<Integer, Integer> depthMap, int depth){ if(node == null) return; depthMap.put(node.val, depth); depth(node.left, depthMap, depth + 1); depth(node.right, depthMap, depth + 1); } public static TreeNode lowestCommonAncestor(TreeNode node, TreeNode n1, TreeNode n2){ if(node == null) return null; if(node == n1 || node == n2) return node; TreeNode left = lowestCommonAncestor(node.left, n1, n2); TreeNode right = lowestCommonAncestor(node.right, n1, n2); if(left == null) return right; else if(right == null) return left; else return node; } public static void main(String[] args){ HashMap<Integer, TreeNode> nodes = new HashMap<>(); for(int i = 0; i < 12; i++){ nodes.put(i, new TreeNode(i)); } nodes.get(1).left = nodes.get(5); nodes.get(1).right = nodes.get(7); nodes.get(5).left = nodes.get(2); nodes.get(5).right = nodes.get(6); nodes.get(6).right = nodes.get(11); nodes.get(7).right = nodes.get(9); nodes.get(9).right = nodes.get(4); System.out.println(A3_MinDistanceInTree.minDistance(nodes.get(1), nodes.get(2), nodes.get(11))); System.out.println(A3_MinDistanceInTree.minDistance(nodes.get(1), nodes.get(1), nodes.get(11))); System.out.println(A3_MinDistanceInTree.minDistance(nodes.get(1), nodes.get(4), nodes.get(11))); } }