Question:
In a binary integer value tree, find the lowest level common ancestor of two values.
// class TreeNode{ // int val; // TreeNode left; // TreeNode right; // } // // Lowest common ancestor question // // If it is a BST tree // Given root, if two inputs are both smaller than root, the common ancestor must be on the root left. // If two inputs are both bigger than root, the common ancestor must be on the right // otherwise, the root is the common ancestor. public TreeNode findLowestCommonAncestor(TreeNode root, TreeNode a, TreeNode b) { // Input validations // root cannot be null. // a || b cannot be null. // a and b must be node in the tree. if (a.val < root.val && b.val < root.val) return findLowestCommonAncestor(root.left, a, b); else if (a.val > root.val && b.val > root.val) return findLowestCommonAncestor(root.right, a, b); else return root; } // For BT // We can Buttom-Up // O(n) public TreeNode findLowestCommonAncestor(TreeNode root, TreeNode a, TreeNode b) { if (root == null) return null; if (root == a || root == b) return root; TreeNode findLeft = findLowestCommonAncestor(root.left, a, b); TreeNode findRight = findLowestCommonAncestor(root.right, a, b); if (findLeft != null && findRight != null) return root; else if (findLeft != null) return findLeft; else return findRight ; } // Or we can top down // // If it is just a normal BT // Given a root // Define hit(root, a, b):int // as the number of nodes in root. // If a and b are both in root, hit = 2 // if only a in root or only b in root, hit = 1 // otherwise hit = 0 // // O(n^2) : for each node, iterate the whole tree. public TreeNode findLowestCommonAncestor(TreeNode root, TreeNode a, TreeNode b) { int lefthit = hit(root, a, b); if (lefthit == 1) return root; else if (lefthit == 2) return findLowestCommonAncestor(root.left, a, b); else return findLowestCommonAncestor(root.right, a, b); } // Assume a != b private int hit(TreeNode node, TreeNode a, TreeNode b) { if (node == null || a == null || b == null) return 0; int r = 0; if (node == a) { a = null; r ++; } if (node == b) { b = null; r ++; } return r + hit(node.left, a, b) + hit(node.right, a, b); }
[Twitter] Lowest Level Common Ancestor
原文地址:http://7371901.blog.51cto.com/7361901/1604607