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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode 285. 二叉搜索树中的中序后继(medium) -> 正文阅读

[数据结构与算法]Leetcode 285. 二叉搜索树中的中序后继(medium)

题目

给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。

节点?p?的后继是值比?p.val?大的节点中键值最小的节点。

示例 1:

输入:root = [2,1,3], p = 1
输出:2
解释:这里 1 的中序后继是 2。请注意 p 和返回值都应是 TreeNode 类型。
示例?2:

输入:root = [5,3,6,2,4,null,null,1], p = 6
输出:null
解释:因为给出的节点没有中序后继,所以答案就返回 null 了。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/inorder-successor-in-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

1.原始解法

直接对树进行中序遍历,存在列表中。找到p节点在列表中的位置,输入他后一个元素(如果在结尾,返回null)。

结果:通过测试用例,用时72ms,内存使用量19MB

代码:

class Solution:
    def LDRTraverse(self, node, nodes):
        if node.left:
            self.LDRTraverse(node.left, nodes)
        nodes.append(node)
        if node.right:
            self.LDRTraverse(node.right, nodes)

    def inorderSuccessor(self, root: 'TreeNode', p: 'TreeNode') -> 'TreeNode':
        # traverse the tree in LDR order 
        # use a list to store visited nodes
        nodes = []
        self.LDRTraverse(root, nodes)

        i = nodes.index(p)
        if i == len(nodes) - 1:
            return
        else:
            return nodes[i+1]

?2. 第一次优化

其实可以对p进行分类讨论,如果p有右子树,则他的中序后继应该为他的右子树中最小的那个节点。所以我们可以在最开始加一个if判断语句。

结果:通过测试用例,用时52ms(击败100%),内存使用量18.8MB

代码:

class Solution:
    def LDRTraverse(self, node, nodes, p):
        if node.left:
            self.LDRTraverse(node.left, nodes, p)           

        nodes.append(node)
        if node.right:
            self.LDRTraverse(node.right, nodes, p)

    def inorderSuccessor(self, root: 'TreeNode', p: 'TreeNode') -> 'TreeNode':
        if p.right:
            node = p.right
            while node.left:
                node = node.left
            return node        
        else:
            # traverse the tree in LDR order 
            # use a list to store visited nodes
            nodes = []
            self.LDRTraverse(root, nodes, p)

            i = nodes.index(p)
            
            if i == len(nodes) - 1:
                return
            else:
                return nodes[i+1]

3. 后续优化

如果做进一步考量,会发现,当p没有右子树时,我们对整棵树的遍历顺序做了记录,这其实是没有必要的。

假如p是其父节点的左子树,则它的中序后继就是父节点。

假如p是其父节点的右子树,则它的中序后继需要一路向上追溯。这里的代码略有些复杂。

相关知识

1. 二叉搜索树

2. 中序遍历

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:36:03  更:2021-08-28 09:38:32 
 
开发: 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/25 22:48:30-

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