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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【剑指offer】<树--中等>【JZ86 在二叉树中找到两个节点的最近公共祖先】 -> 正文阅读

[数据结构与算法]【剑指offer】<树--中等>【JZ86 在二叉树中找到两个节点的最近公共祖先】

在这里插入图片描述
一开始因为漏掉一些关键信息吃了大亏,大家要注意有两点:

  1. 保证二叉树的每个节点的val值不同(这意味着只有一种答案,不需要计算多个距离,找最短的那个)
  2. 结点本身视为自己的祖先(这就是说1->2,1和2共同祖先是1)

v1 – 搜索存表

基本思路是这样的,遍历这棵树,找到要寻找的两个结点的位置,并且把他们的所有父节点存下来。
遍历完成后,比较两个父节点数组,找到最后一个相同的结点,就是最近公共祖先。

oo1,oo2 = None, None
csq, sq1, sq2 = [], None, None
import copy
def search(root):
    global csq, sq1,sq2,oo1,oo2
    if not root:
        return None
    csq.append(root.val)
    if root.val == oo1:
        sq1 = csq.copy()
    if root.val == oo2:
        sq2 = csq.copy()
    if sq1 and sq2:
        return None
    search(root.left)
    search(root.right)
    csq.pop()
    return None
class Solution:
    def lowestCommonAncestor(self , root: TreeNode, o1: int, o2: int) -> int:
        # write code here
        global oo1,oo2
        oo1 = o1
        oo2 = o2
        search(root)
#         print(sq1)
        mlen = min(sq1.__len__(), sq2.__len__())
        for i in range(mlen):
            if i==mlen-1 and sq1[i] == sq2[i]:
                return sq1[i]
            if sq1[i] != sq2[i]:
                return sq1[i-1]
        return sq1[0]

v2 –

参考网上一些大神的写法,递归可以直接做,因为最近的结点满足这样一个条件:
要找的结点同时存在在左右子树中;或者当前结点就是要找的结点,并且要找到另一个结点在其左右子树中。此时我们就返回这个结点的值,一直往回传就好了。

class Solution:
    def lowestCommonAncestor(self , root: TreeNode, o1: int, o2: int) -> int:
        def dfs(root, o1, o2):
            if not root:
                return None 
            left = dfs(root.left, o1, o2)
            right = dfs(root.right, o1, o2)
            if right == -1 and left == -1:       #如果左右都找到,返回这个root的值
                return root.val

            if root.val == o1 or root.val == o2: #如果当前结点是要找的结点
                if left == -1 or right == -1:      #并且左右子树中找到了,那么这个点就是最邻近的结点
                    return root.val
                return -1                        #返回找到
            # 剩下一种情况就是只找到一种
            return left if left else right       #如果左边找到了就返回左边,右边找到了就返回右边
        res = dfs(root, o1, o2)
        return res
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:44:21  更:2022-01-17 11:46:08 
 
开发: 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年11日历 -2024/11/26 19:40:13-

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