题目描述:

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.

解法一:

/**方法一
*
* 给定一个二叉查找树(BST),寻找p和q的最小公共祖先结点
* 解题思路:首先找到到达p的路径和到达q的路径,将这两个路径存入队列中
* 然后对两个路径依次出队列,找出最后一组相同的结点,结束
* @param root
* @return
*/
public static TreeNode lowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){
if(root == null)
return null;
Queue<TreeNode> pPath = new LinkedList<TreeNode>();
Queue<TreeNode> qPath = new LinkedList<TreeNode>();
TreeNode pre = null;
//返回true,说明该结点存在;否则,说明给定的结点不存在,则无需再比较
if(findNode(root, p, pPath) && findNode(root, q, qPath)){
while(!pPath.isEmpty() && !qPath.isEmpty()){
TreeNode pNode = pPath.poll();
TreeNode qNode = qPath.poll();
if(pNode == qNode){ //记录最后一组相同结点
pre = pNode;
} else { //一旦不同,跳出循环
break;
}
}
}
return pre;
} /**
* 在二叉树中查找结点p
* 将其祖先结点依次存入队列
* 返回true,说明该结点存在;否则,说明给定的结点不存在,则无需再比较
* @param root
* @param p
* @param stack
*/
public static boolean findNode(TreeNode root,TreeNode p,Queue<TreeNode> queue){
if(root == null)
return false;
if(p.val == root.val){
queue.add(root);
return true;
}
else if(Integer.valueOf(p.val.toString()) < Integer.valueOf(root.val.toString())){ //在左子树查找
queue.add(root);
return findNode(root.left, p, queue);
}
else {//在右子树查找
queue.add(root);
return findNode(root.right, p, queue);
}
}

解法二:

    /** 方法二
*
* 递归算法
* @param root
* @param p
* @param q
* @return
*/
public static TreeNode LCA(TreeNode root,TreeNode p,TreeNode q){
if (root == null || p == null || q == null) return null;
if (Integer.valueOf(p.val.toString()) < Integer.valueOf(root.val.toString()) && Integer.valueOf(q.val.toString()) < Integer.valueOf(root.val.toString())) //两个结点都在左子树
return LCA(root.left, p, q);
else if (Integer.valueOf(p.val.toString()) > Integer.valueOf(root.val.toString()) && Integer.valueOf(q.val.toString()) > Integer.valueOf(root.val.toString())) //两个结点都在右子树
return LCA(root.right, p, q);
else
return root; //若两个结点一个在左子树上,另一个在右子树上,则共同祖先结点为当前的root
}

Lowest Common Ancestor of a Binary Search Tree(Java 递归与非递归)的更多相关文章

  1. [geeksforgeeks] Lowest Common Ancestor in a Binary Search Tree.

    http://www.geeksforgeeks.org/lowest-common-ancestor-in-a-binary-search-tree/ Lowest Common Ancestor ...

  2. leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree

    leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree 1 题目 Binary Search Tre ...

  3. Lowest Common Ancestor of a Binary Search Tree、Lowest Common Ancestor of a Binary Search Tree

    1.Lowest Common Ancestor of a Binary Search Tree Total Accepted: 42225 Total Submissions: 111243 Dif ...

  4. leetcode 235. Lowest Common Ancestor of a Binary Search Tree 236. Lowest Common Ancestor of a Binary Tree

    https://www.cnblogs.com/grandyang/p/4641968.html http://www.cnblogs.com/grandyang/p/4640572.html 利用二 ...

  5. 【LeetCode】235. Lowest Common Ancestor of a Binary Search Tree (2 solutions)

    Lowest Common Ancestor of a Binary Search Tree Given a binary search tree (BST), find the lowest com ...

  6. 235.236. Lowest Common Ancestor of a Binary (Search) Tree -- 最近公共祖先

    235. Lowest Common Ancestor of a Binary Search Tree Given a binary search tree (BST), find the lowes ...

  7. LeetCode_235. Lowest Common Ancestor of a Binary Search Tree

    235. Lowest Common Ancestor of a Binary Search Tree Easy Given a binary search tree (BST), find the ...

  8. [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 BS ...

  9. [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点

    4.7 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tr ...

  10. [LeetCode] 235. 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 BS ...

随机推荐

  1. 【做题】BZOJ2534 L-gap字符串——调和级数

    题意:给出一个字符串,问其中有多少个子串恰好为\(uvu\)的形式.其中,\(u\)非空,\(v\)的长度恰好为\(l\). \(n \leq 5 \times 10^4\) 我们设两个后缀的起点分别 ...

  2. 最最简单的c语言函数汇编分析

    0x01 环境 xp+vc6.0 0x02 代码 int plus(int x, int y) { return 0; } 以下是vc6.0的反汇编窗口 1: int plus(int x, int ...

  3. Docker7之Docker overview

    Docker is an open platform for developing, shipping, and running applications. Docker enables you to ...

  4. Docker1之Container

    Document An image is a lightweight, stand-alone, executable package that includes everything needed ...

  5. spring 配置ibatis和自动分页

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  6. PHP变量的值类型和引用类型

    PHP 变量在内存中保存的并不直接是值的内容而是值的地址.比如: $a = 1; 从表面上看起来似乎是 $a 直接存储了 1 这个值.但是实际情况是,PHP 解释器创建了变量 $a , 将值 1 存入 ...

  7. Git、GitHub、GitLab三者之间的联系以及区别

    在讲区别以及联系之前先简要的介绍一下,这三者都是什么(本篇文章适合刚入门的新手,大佬请出门左转) 1.什么是 Git? Git 是一个版本控制系统. 版本控制是一种用于记录一个或多个文件内容变化,方便 ...

  8. Echarts 地图上显示数值

    Echarts 地图上展示数值,效果如下: 上代码:关键代码用红色 series: [ { //name: '香港18区人口密度', type: 'map', mapType: 'jiangsu', ...

  9. 判断是否在同一个线程-GetCurrentThreadId()用法

    线程 在一个程序中,这些独立运行的程序片断叫作"线程"(Thread),利用它编程的概念就叫作"多线程处理".利用线程,用户可按下一个按钮,然后程序会立即作出响 ...

  10. ngui项目花屏问题

    项目用的ngui 最近在金立手机上遇到一个问题就是  启动的时候会花一下屏幕 一闪而过  由于ngui默认camera使用的是clear depth  所以按照网上的办法修改 color 跟skybo ...