IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法-二叉树中俩节点的最近公共祖先 -> 正文阅读

[数据结构与算法]算法-二叉树中俩节点的最近公共祖先

问题

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

样例

img

例如给定上述二叉树结构, root = [6,2,8,0,4,7,9,null,null,3,5]

节点 2 和节点 8 的最近公共祖先是 6

思路

对于树的结构问题一般考虑递归的方式去解决,本题也不例外。

首先根节点肯定是二者的父节点,题目是去找最近的父节点,那么有以下几种情况

  • 两个节点都在根节点的左子树中,递归的去左子树中去找最近的父节点
  • 两个节点都在根节点的右子树中,递归的去右子树中去找最近的父节点
  • 两个节点分别在左右子树中,这个时候它俩的最近的父节点就是根节点

实现

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.leftNode = None
        self.rightNode = None
        
class Solution(TreeNode):
    """
    @param: root: the root of the binary search tree
    @param: A: A treenode in a binary
    @param: B: A treenode in a binary
    @Return: return the latest common ancestor of the two nodes
    """
    def lowestCommonAncestor(self, root, A, B):
    	if root is None:
            return None
       	if root == A or root == B:  # 两个节点中的至少一个是root时候,直接返回根节点
            return root
        
        left = self.lowestCommonAncestor(root.left, A, B)  # 在左子树中去找
        right = self.lowestCommonAncestor(root.right, A, B)  # 在右子树中去找
        if left and right:  # 如果左右子树都有值,表明两个元素分别在该树的左子树和右子树中
            return root
       	if left:		# 在左子树中找到了最近的公共父节点
            return left
        if right:	 	# 在右子树中找到了最近的公共父节点
            return right
       	return None

解惑

刚开始看到这个递归的解决时候,对有个条件有点疑惑:
在这里插入图片描述

为什么left 和 right都存在值时候,返回的结果是根节点root,为什么表明俩元素分别在根节点的左子树和右子树中,原因是

在这里插入图片描述

看蓝色部分代码,如果待查找的元素跟根节点一样的时候,就直接返回该节点。左右子树都有返回结果的时候,表明返回的值就是其中的一个节点本身。因此两个节点的最近的公共父节点就是根节点本身。

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:44:49  更:2021-07-10 14:46:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 15:09:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码