描述:给定一个二叉搜索树,找到该树中两个指定节点的最近公共节点(最近公共祖先节点可以为节点本身)

说明:所有节点的值都是唯一的。两个节点为不同节点且存在于给定的二叉搜索树。


首先复习一下二叉搜索树的性质:

  1. 左子树上所有节点的值都小于等于根节点的值
  2. 右子树上所有节点的值都大于等于根节点的值
  3. 左子树和右子树也都是二叉搜索树

方法一:递归

  1. 从根节点开始遍历树
  2. 如果节点p和节点q都在右子树上,那么以右孩子为根节点继续1的操作
  3. 如果节点p和节点q都在左子树上,那么以左孩子为根节点继续1的操作
  4. 如果条件2和条件3都不成立,这意味着已经找到节点p和节点q的公共祖先了。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {int parentVal = root.val;int pVal = p.val,qVal = q.val;if (pVal > parentVal && qVal > parentVal) {return lowestCommonAncestor(root.right, p, q);} else if (pVal < parentVal && qVal < parentVal) {return lowestCommonAncestor(root.left, p, q);} else {return root;}}

递归算法是大家最熟悉的算法,也是第一时间想到的解决办法,下面介绍另外一种更加快捷方便的算法。

方法二:清新脑回路 

由二叉搜索树的特性可以知道,如果两个节点刚好位于左右子树,那么用根节点减去左子树乘以根节点减去右子树的乘积是小于等于0;所以由此特性可以写出更巧妙的算法:

public class LowestCommonAncestor_235 {private static TreeNode res = null;public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {lca(root, p, q);return res;}private static void lca(TreeNode root, TreeNode p, TreeNode q) {if ((root.val-p.val) * (root.val - q.val) <= 0) {res = root;} else if (root.val < p.val && root.val < q.val){lca(root.right, p , q);} else {lca(root.left, p , q);}}public static void main(String[] args) {}
}

以上就是该算法的全部输出,有木有干货满满的样子。


辛苦各位大佬看完,有兴趣的可以关注下公众号(左),或者微信私信(右)共同学习进步;

    

Leetcode-二叉搜索树最近公共祖先相关推荐

  1. 经典算法——二叉搜索树的公共祖先节点

    介绍 二叉搜索树的公共祖先节点是指:对于给定的两个节点p.q,向上寻找离二者最近的公共节点. public class Node<T extends Comparable<T>> ...

  2. 二叉搜索树的公共祖先,二叉树的最近公共祖先

    二叉树的定义: # Definition for a binary tree node. class TreeNode:def __init__(self, x):self.val = xself.l ...

  3. 二叉搜索树最近公共祖先二叉树最近公共祖先

    什么是二叉搜索树? 对于二叉树的任意一个节点n: (1)其左子树下的每个节点的值都小于节点n的值: (2)其左子树下的每个节点的值都大于节点n的值: 思路与算法 从根节点开始遍历: 如果当前节点的值大 ...

  4. 树形结构:从二分查找,二叉搜索树寻找最近祖先,从递归到迭代,实现技巧总结

    二分查找,二叉搜索树寻找最近祖先均是典型分治问题,把原问题分成三部分考虑,递归实现简单,迭代实现也比较简单,里面蕴含了一些从从递归到迭代的技巧,注意这里没有使用模拟栈技术. 深究其原因是,这一类型的递 ...

  5. 二叉搜索树的最近祖先

    235. Lowest Common Ancestor of a Binary Search Tree 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:& ...

  6. 剑指offer | 面试题54:二叉搜索树的第k大节点

    转载本文章请标明作者和出处 本文出自<Darwin的程序空间> 本文题目和部分解题思路来源自<剑指offer>第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 给定 ...

  7. LeetCode实战:二叉搜索树的最近公共祖先

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...

  8. leetcode 235. 二叉搜索树的最近公共祖先(Java版,树形dp套路)

    题目 原题地址:leetcode 235. 二叉搜索树的最近公共祖先 说明: 所有节点的值都是唯一的. p.q 为不同节点且均存在于给定的二叉搜索树中. 题解 关于 树形dp 套路,可以参考我的另一篇 ...

  9. leetcode —— 235. 二叉搜索树的最近公共祖先

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖 ...

最新文章

  1. 使用cacti对mysql监控的图像解释_Linux下的监控软件cacti的安装与配置
  2. 基于 Flink 的严选实时数仓实践
  3. 建设世界级数据中心正当时
  4. 1 微信公众号开发 服务器配置 有什么用
  5. ubuntu16.04安装opencv3.1.0(包含opencv_contrib模块)
  6. 主引導记录(MBR)
  7. http响应头和请求头配置对照表
  8. 手机电脑同步投屏演示工具-Wormhole
  9. gunicorn 安装部署详解
  10. mpu和嵌入式linux区别,嵌入式MCU与MPU的区分和MCU开发中的三个误区
  11. bootstrapTable动态渲染数据获取
  12. solr6.4服务器+Tomcat+中文分词器
  13. ThinkPad E420升级改造过程
  14. 无法在Android手机上拨打或接听电话,如何解决
  15. java mail 是什么_JavaMail是什么意思
  16. 股市理论---牛马熊
  17. 利用python3爬虫下载图片、pdf文档
  18. 荣誉系统排名是整个服务器,[翻译分享]荣誉军衔晋升系统初步解析(2006.4.27更新)...
  19. 基于php的养生食疗,小寒养生四大食谱
  20. 焊接LQFP48 和 LQFP64 封装的芯片的记录

热门文章

  1. 性能测试过程中oracle数据库报ORA-27301 ORA-27302错
  2. SQL Server Profiler
  3. 用 Anaconda 完美解决 Python2 和 python3 共存问题
  4. Recurrent Neural Network系列1--RNN(循环神经网络)概述
  5. openfire过滤脏话插件,控制消息是否发送
  6. Windows10 bash 巨硬和Canonical Ltd.的PY交易
  7. openstack 在线repo
  8. 经典SQL回顾之晋级篇
  9. android视频录制(调用系统视频录制),生成缩略图
  10. 【转载】移植FFMpeg到VC环境心得