LeetCode Day3
Lowest Common Ancestor of a Binary Search Tree

import java.util.ArrayList;
import java.util.List;
/**
* LeetCode: Lowest Common Ancestor of a Binary Search Tree
* Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST
*
* @author LuoPeng
* @time 215.8.5
*
*/
public class LowestCommonAncestor {
/**
* If a node A is the common ancestor, and its left child and right child are not at the same time.
* A is the Lowest Common Ancestor
*
* @param root the root of the tree
* @param p
* @param q
* @return lowest common ancestor (LCA) of p and q
*/
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if ( root == null || p == root || q == root) {return root;}
TreeNode lca = null;
/*
* If one child is null, the lowest common ancestor must be the child of the other child of root
*/
if ( root.left == null) {
lca = lowestCommonAncestor(root.right, p, q);
} else if ( root.right == null) {
lca = lowestCommonAncestor(root.left, p, q);
} else {
boolean first = isCommonAncestor(root.left, p, q);
boolean second = isCommonAncestor(root.right, p, q);
if ( first) {
// if root.left is a common ancestor, the LCA must be root.left or a child of it.
lca = lowestCommonAncestor(root.left, p, q);
} else if (second) {
// if root.right is a common ancestor, the LCA must be root.right or a child of it.
lca = lowestCommonAncestor(root.right, p, q);
} else {
// For root is a common ancestor of p and q, the LCA must be root if the left child
// and right child are not the common ancestors.
lca = root;
}
}
return lca;
}
/**
* Whether root is the common ancestor of p and q
*
* @param root a node
* @param p a node
* @param q a node
* @return True if root is the common ancestor of p and q, otherwise false.
*/
private boolean isCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if ( root == null) {return false;}
TempQueue queue = new TempQueue();
TreeNode temp = null;
boolean first = false;
boolean second = false;
// Breadth First Search
queue.push(root);
while ( !queue.empty()) {
temp = queue.peek();
queue.pop();
if ( temp ==p) {
first = true;
} else if ( temp == q) {
second = true;
}
// add the child
if ( temp.left != null) {
queue.push(temp.left);
}
if ( temp.right != null) {
queue.push(temp.right);
}
// break if p and q have bean found
if ( first && second) {
break;
}
}
return first && second;
}
}
/**
* Queue
*
*/
class TempQueue {
public void push(TreeNode x) {
values.add(x);
}
public void pop() {
values.remove(0);
}
public TreeNode peek() {
return values.get(0);
}
public int size() {
return values.size();
}
public boolean empty() {
return values.size()==0;
}
private List<TreeNode> values = new ArrayList<TreeNode>();
}
LeetCode Day3的更多相关文章
- 【LeetCode算法题库】Day3:Reverse Integer & String to Integer (atoi) & Palindrome Number
[Q7] 把数倒过来 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Outpu ...
- leetcode每日刷题计划-简单篇day3
收到swe提前批面试hhh算是ep挂了的后续 努力刷题呀争取今年冲进去! Num 21 合并两个有序链表 Merge Two Sorted Lists 注意新开的链表用来输出结果的是ListNode ...
- 我为什么要写LeetCode的博客?
# 增强学习成果 有一个研究成果,在学习中传授他人知识和讨论是最高效的做法,而看书则是最低效的做法(具体研究成果没找到地址).我写LeetCode博客主要目的是增强学习成果.当然,我也想出名,然而不知 ...
- LeetCode All in One 题目讲解汇总(持续更新中...)
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 477 Total Hamming Distance ...
- [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串
Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...
- Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
- Leetcode 笔记 112 - Path Sum
题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
随机推荐
- $.cookie is not a function
在调试网站的时候,用jquery获取cookie时,报错: $.cookie is not a function; 一般情况$.cookie is not a function;错误原因: 一.没有引 ...
- IOS Application生命周期
第一阶段 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *) ...
- 电子设计省赛--DMA与ADC
//2014年4月17日 //2014年6月20日入"未完毕" //2014年6月21日 DMA可实现无需cpu控制中断的传输数据保存. 特别是ADC转换多个通道时要用到. 关键是 ...
- 大话NoSql
之前看过一本名叫<<大数据挑战的书>>.里面主要讲了NOSQL的内容,感觉讲得确实不错,今天来又一次温习一下,我们大话NOSQL.说道NOSQL.我们肯定联想到的内容就是Big ...
- 从头开始——重装ubuntu
一.装系统 环境:计算机原本装的系统是windows7+ubuntu 14.04,后来ubuntu的启动项被我手贱破坏了,进不了ubuntu,只能重新安装. 启动盘:使用UltraISO软碟通制作U ...
- LDAP实例异常停止日志提示虚拟内存virtual memory不足
[05/Oct/2014:20:50:37 +0800] - ERROR<5135> - Resource Limit - conn=-1 op=-1 msgId=-1 - Memory ...
- onvif规范的实现:使用gSOAP创建SOAP调用实例
预备知识 ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供.ONVIF规范涵盖了完全的XML及WSDL的定义.每一个支持ONVIF规范的终端设备均须提供与功能相应的 ...
- Hortonworks 用于做 Sentimental Analysis的Hiveddl.sql 文件
The hiveddl.sql script has performed the following steps to refine the data: Converted the raw Twitt ...
- Android开发错误汇总
[错误信息] [2011-01-19 16:39:10 - ApiDemos] WARNING: Application does not specify an API level requireme ...
- Median of Two Sorted Arrays(Java)
求2个数组的中位数 方法很多 但是时间复杂度各异 1利用数组copy方法先融合两个数组,然后排序,找出中位数 import java.lang.reflect.Array; import java.u ...