Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”
Example 1:
Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 Output: 6 Explanation: The LCA of nodes 2 and 8 is 6.
Example 2:
Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 Output: 2 Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.
Example 3:
Input: root = [2,1], p = 2, q = 1 Output: 2
Constraints:
- The number of nodes in the tree is in the range
[2, 105]
. -109 <= Node.val <= 109
- All
Node.val
are unique. p != q
p
andq
will exist in the BST.
My answer: it is one important constraints that both p and q must exits. My answer works for any binary tree, even not BST
Better solution given BST: find the 1st node whose value is between p and q, starting from top-down direction. It is put after below answer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null || root == p || root == q) { return root; } TreeNode leftResult = lowestCommonAncestor(root.left, p, q); TreeNode rightResult = lowestCommonAncestor(root.right, p, q); if (leftResult == null && rightResult == null) { return null; } else if (leftResult == null) { return rightResult; } else if (rightResult == null) { return leftResult; } else { return root; } } } |
Solution for BST
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // if (root == null || root == p || root == q) { // return root; // } // TreeNode leftResult = lowestCommonAncestor(root.left, p, q); // TreeNode rightResult = lowestCommonAncestor(root.right, p, q); // if (leftResult == null && rightResult == null) { // return null; // } else if (leftResult == null) { // return rightResult; // } else if (rightResult == null) { // return leftResult; // } else { // return root; // } if (p.val > q.val) { TreeNode temp = null; temp = p; p = q; q = temp; } if (root == null || (root.val >= p.val && root.val <= q.val)) { return root; } if (root.val >= q.val) { return lowestCommonAncestor(root.left, p, q); } if (root.val <= p.val) { return lowestCommonAncestor(root.right, p, q); } return null; } } |
No comments:
Post a Comment