什么是二叉搜索树?

对于二叉树的任意一个节点n:

(1)其左子树下的每个节点的值都小于节点n的值;

(2)其左子树下的每个节点的值都大于节点n的值;

思路与算法

从根节点开始遍历;

  1. 如果当前节点的值大于p和q的值,说明p和q应该在当前节点的左子树,应该将当前节点移动到它的左子节点;
  2. 如果当前节点的值小于p和q的值,说明p和q应该在当前节点的右子树,应该将当前节点移动到它的右子节点;
  3. 如果当前节点不满足上述两条条件,当前节点是分叉点,要么p和q在不同的树上,要么其中一个当前节点。

注意:这里的是二叉树,不是二叉搜素树。

分为以下几种情况:

  1. p=root,q在root的左子树或者右子树中;
  2. q=root,p在root的左子树或者右子树中;
  3. p和q都在root的子树中;
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':self.ans=TreeNode(0)def dfs(root,p,q):if not root:return Falselson=dfs(root.left,p,q)rson=dfs(root.right,p,q)if (lson and rson) or((lson or rson) or (root.val==p.val or root.val==q.val)):self.ans=rootreturn lson or rson or p.val==root.val or q.val==root.valdfs(root,p,q)return self.ans

定义了lson和rson两个参数来表明p或者q是否存在左右子树中

 lson=dfs(root.left,p,q)rson=dfs(root.right,p,q)

如果lson或者rson都为True的话,那么当前节点就是最近公共祖先;如果root=q,且p在左右子树中,那么当前root就是要求的解;如果root=p,且q在左右子树中,那么当前root就是要求的解;

 if (lson and rson) or((lson or rson) and (root.val==p.val or root.val==q.val)):self.ans=root

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

  1. [leetcode] 96. 不同的二叉搜索树 +[补充] 不同的二叉树,不同形态的二叉树的个数----catalan数

    leetcode官方的题解:https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha ...

  2. L2-004 这是二叉搜索树吗?(二叉树)

    题目连接 https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 视频讲解 https://www. ...

  3. [剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]

    [问题描述][第235题][二叉搜索树的最近公共祖先][简单] 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p. ...

  4. pta 是否完全二叉搜索树_二叉树:构造一棵搜索树

    给「代码随想录」一个星标吧! ❝ 构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指 ...

  5. 2021-10-11 二叉树,二叉搜索树及其相关23个操作 C++实现笔记(复习用,含C指针复习)

    学数据结构到现在写的最久的一部分,简单总结一下这一周 1.考虑到未来考试要求,实现语言从java换成了C++,没想到意外的顺利 2.没别的了,干就完了 3.代码肯定有错误的地方,虽然我自认为是完美主义 ...

  6. C语言判断二叉树是否为二叉搜索树(附完整源码)

    C语言判断二叉树是否为二叉搜索树 C语言判断二叉树是否为二叉搜索树完整源码(定义,实现,main函数测试) C语言判断二叉树是否为二叉搜索树完整源码(定义,实现,main函数测试) #include ...

  7. 判定一棵二叉树是否是二叉搜索树

    问题 给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)? 解法1:暴力搜索 首先说明一下二叉树和二叉搜索树的区别.二叉树指这样的树结构,它的每个结点的孩子数目最多为 ...

  8. Suzy找到实习了吗 Day23 | 二叉树最后一节!669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

    669. 修剪二叉搜索树 题目 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修剪树 不应该 改变保 ...

  9. leetcode刷题记录--数据结构;深度优先搜索算法;二叉树;平衡树;1020. 飞地的数量;1669. 合并两个链表;108. 将有序数组转换为二叉搜索树

    1020. 飞地的数量 难度中等131 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格.1 表示一个陆地单元格. 一次 移动 是指从一个陆地单元格走到另一个相邻(上 ...

  10. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

最新文章

  1. Cinder 的 I/O QoS
  2. 我的Android进阶之旅------Android Studio 快捷键整理分享
  3. c语言键盘回调函数键盘的码,深入浅出剖析C语言函数指针与回调函数(三)
  4. 同构字符串(Isomorphic Strings)
  5. java图片上传被旋转,在其他大牛那看到的java手机图片上传旋转问题的解决方法...
  6. 无法连接iphone软件更新服务器_上海腾科教育今日分享——提示“无法连接到服务器”的解决办法...
  7. 【赠书】当深度学习遇上图: 图神经网络的兴起!
  8. Nvidia-Docker
  9. 【编程开发】 C与C++中的关于函数指针的强制类型转换与指针函数的关系
  10. FreeRTOS 教程指南 学习笔记 第四章 队列管理
  11. JAVA JSP网上订餐系统JSP餐厅点餐系统源码JSP点餐系统JSP网上订餐系统JSP在线订餐
  12. JDK全部版本高速下载,JDK1.8高速下载,JDK1.9、JDK10、JDK11、JDK12、JDK13、JDK14、JDK15下载
  13. 25个深度学习相关公开数据集
  14. cve_2019_0708复现踩坑
  15. 交大网院计算机第五次作业答案,2015交大网院计算机第三次作业word操作题
  16. 自定义notepad++ --添加插件SourceCookifier
  17. 写给海淘新手的 转运选择 攻略(2014最新版,10月13日更新)--转自什么值得买
  18. 简化 Spring 控制器:只须写接口即可
  19. app自动化测试appium教程之番外1——进阶补充内容
  20. 漫步者lollipods如何调节音量_漫步者LolliPods怎么配对双耳?如何切换单耳和双耳模式...

热门文章

  1. 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)
  2. 加密交易所的新战场:高频交易
  3. c 抓取ajax异步数据,用requests.post提交表单抓取异步ajax信息失败
  4. LaTeX \genfrac 分式命令
  5. python直方图上加正态分布线_Python直方图绘制(与标准正态分布进行比较)
  6. linux怎么刷机教程,Ubuntu手机版来了 附刷机教程
  7. alertmanager 钉钉告警配置
  8. P问题、NP问题、NPC问题、NP难问题的概念[zz]
  9. 9个宝藏级的神奇网站!个个精品,让你人生开挂,效率翻倍
  10. 为什么rand()每次产生的随机数都一样