您的位置:首页 > 其它

Leetcode 235. Lowest Common Ancestor of a Binary Search Tree

2016-10-07 01:59 417 查看


235. Lowest Common Ancestor of a Binary Search Tree

Total Accepted: 96078 Total Submissions: 254837 Difficulty: Easy

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 v and w as the lowest node in T that 
has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______6______
/              \
___2__          ___8__
/      \        /      \
0      _4       7       9
/  \
3   5

For example, the lowest common ancestor (LCA) of nodes 
2
 and 
8
 is 
6
.
Another example is LCA of nodes 
2
 and 
4
 is 
2
,
since a node can be a 
descendant of itself according to the LCA definition.

Hide Company Tags
 Amazon Microsoft Facebook Twitter

Hide Tags
 Tree

Hide Similar Problems
 (M) Lowest Common Ancestor of a Binary Tree

思路:

解法一:

沿用在236题中提到的思路,用个dfs类型的contains(TreeNode root, TreeNode p)来判断是不是包含该节点。但是这题的运行时间就只有9ms,而上一题是980ms。。。

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/

public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (!contains(root, p.val) || !contains(root,q.val)) return null;

if ((root.val == q.val) || (root.val == p.val)) return root;

//不同两边
if (contains(root.left, p.val) && contains(root.right, q.val)) return root;
if (contains(root.left, q.val) && contains(root.right, p.val)) return root;

//相同
return contains(root.left,p.val) ? lowestCommonAncestor(root.left,p,q) : lowestCommonAncestor(root.right,p,q);
}

public boolean contains(TreeNode root, int val){
if (root == null) return false;
if (root.val == val){
return true;
}else{
return root.val > val ? contains(root.left, val) : contains(root.right, val);
}
}


思路二:

很巧妙的思路。利用BST的性质。

如果俩node节点的最小值大于root.val,那么说明一定在右子树。

如果俩node节点的最大值小于root.val,那么说明一定在左子树。

否则应该返回root。

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/

public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || p == null || q == null) return null;

if(Math.max(p.val, q.val) < root.val) {
return lowestCommonAncestor(root.left, p, q);
} else if(Math.min(p.val, q.val) > root.val) {
return lowestCommonAncestor(root.right, p, q);
} else return root;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Tree