当前位置:网站首页>剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
2022-08-01 04:45:00 【愈努力俞幸运】
在二叉搜索树中:
1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
3.任意结点的左、右子树也分别为二叉搜索树.
即任意节点,左<根<右
祖先的定义: 若节点 p 在节点 node 的左(右)子树中,或 p=node,则称 node是 p 的祖先。
最近公共祖先的定义: 设节点 node为节点 p,q的某公共祖先,若其左子节点node.left 和右子节点 node.right 都不是 p,q的公共祖先,则称node是 “最近的公共祖先” 。
根据以上定义,若node 是 p,q的 最近公共祖先 ,则只可能为以下情况之一:
1. p 和 q 在node 的子树中,且分列node的 异侧(即分别在左、右子树中);
2. p =node,且 q在node的左或右子树中;
3. q =node,且 p在 node的左或右子树中;
本题给定了两个重要条件:① 树为 二叉搜索树 ,② 树的所有节点的值都是 唯一 的。根据以上条件,可方便地判断 p,q与 node 的子树关系,即:
若 node .val < p.val ,则 pp 在 node 右子树 中;
若 node .val > p.val ,则 pp 在node 左子树 中;
若 node .val = p.val ,则 p 和node 指向 同一节点 。
所以从根节点开始看,p,q都在node左子树中就去迭代(或搜索)node左子树,
p,q都在node右子树中就去迭代(或搜索)node右子树,
否则就返回node
方法一:迭代
循环搜索: 当节点node 为空时跳出;
当 p, q都在node 的 右子树 中,则遍历至 node.right ;
否则,当 p, q都在 node的 左子树 中,则遍历至 node.left ;
否则,说明找到了 最近公共祖先 ,跳出。
返回值: 最近公共祖先node。
class Solution:
def lowestCommonAncestor(self, root, p, q):
while root:
if root.val>p.val and root.val>q.val:
root=root.left
elif root.val<p.val and root.val<q.val:
root=root.right
else:
break
return rootclass Solution:
def lowestCommonAncestor(self, root, p, q):
while root:
if root.val>p.val and root.val>q.val:
root=root.left
elif root.val<p.val and root.val<q.val:
root=root.right
else: return root方法二:递归
递推工作:
当 p, q 都在node 的 右子树 中,则开启递归 node.right 并返回;
否则,当 p, q都在 noed 的 左子树 中,则开启递归 noed.left 并返回;
终止条件:就是都不满足返回节点node
返回值: 最近公共祖先node。
class Solution:
def lowestCommonAncestor(self, root, p, q):
def dfs(root,p,q):
if root.val > p.val and root.val > q.val:
return dfs(root.left,p,q)
if root.val < p.val and root.val < q.val:
return dfs(root.right,p,q)
return root
return dfs(root,p,q)
class Solution:
def lowestCommonAncestor(self, root, p, q):
if root.val > p.val and root.val > q.val:
return self.lowestCommonAncestor(root.left,p,q)
if root.val < p.val and root.val < q.val:
returnself.lowestCommonAncestor(root.right,p,q)
return root
边栏推荐
- 故乡的素描画
- This article takes you to understand the past and present of Mimir, Grafana's latest open source project
- 56:第五章:开发admin管理服务:9:开发【文件上传到,MongoDB的GridFS中,接口】;(把文件上传到GridFS的SOP)
- typescript22-接口继承
- 6-23漏洞利用-postgresql代码执行利用
- PMP 项目质量管理
- Logitech Mouse Experience Record
- 请问shake数据库中为什么读取100个collection 后,直接就退出了,不继续读了呢?
- RSA主要攻击方法
- 动态规划 01背包
猜你喜欢

y83.第四章 Prometheus大厂监控体系及实战 -- prometheus告警机制进阶(十四)

【无标题】

时时刻刻保持敬畏之心

Make your Lottie support word wrapping in text fields

The difference between scheduleWithFixedDelay and scheduleAtFixedRate

数组问题之《两数之和》以及《三数之和 》

7月编程排行榜来啦!这次有何新变化?

【目标检测】YOLOv7理论简介+实践测试

UE4 制作遇到的问题

typescript27 - what about enumeration types
随机推荐
Pyspark Machine Learning: Vectors and Common Operations
高数 | 【重积分】线面积分880例题
Mysql基础篇(约束)
typescript24 - type inference
25. 这三道常见的面试题,你有被问过吗?
typescript21 - Comparison of Interfaces and Type Aliases
Unity's primary method for implementing PlanarReflection under the BuildIn rendering pipeline
What is dynamic programming and what is the knapsack problem
Progressive Reconstruction of Visual Structure for Image Inpainting 论文笔记
typescript24-类型推论
Excel做题记录——整数规划优化模型
The Principle Of Percona Toolkit Nibble Algorithm
今日睡眠质量记录68分
SQL Analysis of ShardingSphere
智芯传感输液泵压力传感器 为精准智能控制注入科技“强心剂”
leetcode6132. Make all elements in an array equal to zero (simple, weekly)
Visual Studio提供的 Command Prompt 到底有啥用
Flutter Tutorial 01 Configure the environment and run the demo program (tutorial includes source code)
开源许可证 GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
7 行代码搞崩溃 B 站,原因令人唏嘘!
https://leetcode.cn/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/