【LeetCode】面试题 04.06. 后继者

169 阅读2分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 题目指定两个参数root和p

二、思路分析:

我们阅读题意,要求在二叉搜索树中找出指定结点的下一个结点。如果指定结点为叶子时,则下一个结点返回null。

作为小白我,前几天才对树、二叉树、二叉树三种遍历方式才基本搞明白,今天又碰上了二叉搜索树的概念。

在解答该题时,还是需要把题目中不明白的地方搞懂,什么是二叉搜索树?

二叉搜索树要求数据必须是有序的,每一次查找、操作时都要维护一个有序的数据集

  • 二叉搜索树,又名二叉查找树、二叉排序树(Binary Sort Tree)
  • 二叉搜索树有三个特点:

    1. 当其左子树不为空时,则左子树上所有节点的值均小于其根节点的值
    2. 当其右子树不为空时,则右子树上所有节点的值均大于器根节点的值
    3. 左、右子树都分别为二叉搜索树

因此,我们再回头读取题目,有三种情况:

  • 当 P.val => root.val 时,在右子树上查找

    1. P节点,有右子树

    image.png

    1. P节点,无右子树,则返回Null

    image.png

  • 当 P.val < root.val 时,在左子树上查找比P.val大的节点

    1. 若在左子树上没有找到P.val的节点,则返回root.val

    image.png

    1. 若在左子树上找到大于P.val的节点

    image.png

根据上述的思路分析,解决该题可以使用 递归方法,Python代码如下:

class Solution(object):
    def inorderSuccessor(self, root, p):
        if not root: return None
        if root.val <= p.val:
            return self.inorderSuccessor(root.right, p)
        findLeft = self.inorderSuccessor(root.left, p)
        return findLeft if findLeft else root

我们也可以使用迭代的方法,中序遍历二叉树模板,Python代码实现如下:

class Solution(object):
    def inorderSuccessor(self, root, p):
        """
        :type root: TreeNode
        :type p: TreeNode
        :rtype: TreeNode
        """

        cur,stack,res = root,[],None

        while cur or stack:
            while cur:
                stack.append(cur)
                cur = cur.left
            tmp = stack.pop()
            if p == res:
                return tmp
            res = tmp
            cur = tmp.right

        return None

三、总结:

本题仍然是关于二叉搜索树的题目,在该题目中我们要掌握二叉搜索树存储的数据都是有序数据的,并且左子树上的值小于右子树的值。

image.png

时间复杂度为O(n),空间复杂度O(N)

以上本期的内容,欢迎大佬们点赞评论,下期见~~