/* * January 6, 2016 * blog: https://github.com/mengli/leetcode/blob/master/LowestCommonAncestorOfaBinarySearchTree.java * * Make two changes: * 1. use short name - LCA * 2. use Math.Max and Math.Min function * */ public static TreeNode LCA(TreeNode root, TreeNode p, TreeNode q) { if (root == null || p == null || q == null) // bug001 fix return null; if (root.val < Math.Min(p.val, q.val)) return LCA(root.right, p, q); else if (root.val > Math.Max(p.val, q.val)) return LCA(root.left, p, q); else return root; }
/* * Leetcode question 235 * Lowest common ancestor in binary search tree * January 6, 2016 * * p or q may be null pointer, so p.val or q.val cannot be accessed. * Base Case is wrong - Sorry! * */ public static TreeNode lowestCommonAncestor_bug(TreeNode root, TreeNode p, TreeNode q) { if (root == null) return null; if (root.val < p.val && root.val < q.val) return lowestCommonAncestor_bug(root.right, p, q); else if (root.val > p.val && root.val > q.val) return lowestCommonAncestor_bug(root.left, p, q); else return root; }
static void Main(string[] args) { TreeNode n1 = new TreeNode(4); n1.left = new TreeNode(2); n1.right = new TreeNode(6); n1.left.left = new TreeNode(1); n1.left.right = new TreeNode(3); n1.right.left = new TreeNode(5); n1.right.right = new TreeNode(7); TreeNode r = LCA(n1, n1.right.left, n1.left.right); TreeNode r2 = LCA(n1, n1.left.left, n1.left.right); }
public TreeNode(int x) { left = null; right = null; val = x; }