持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 题目指定两个参数root和p
二、思路分析:
我们阅读题意,要求在二叉搜索树中找出指定结点的下一个结点。如果指定结点为叶子时,则下一个结点返回null。
作为小白我,前几天才对树、二叉树、二叉树三种遍历方式才基本搞明白,今天又碰上了二叉搜索树的概念。
在解答该题时,还是需要把题目中不明白的地方搞懂,什么是二叉搜索树?
二叉搜索树要求数据必须是有序的,每一次查找、操作时都要维护一个有序的数据集
- 二叉搜索树,又名二叉查找树、二叉排序树(Binary Sort Tree)
-
二叉搜索树有三个特点:
- 当其左子树不为空时,则左子树上所有节点的值均小于其根节点的值
- 当其右子树不为空时,则右子树上所有节点的值均大于器根节点的值
- 左、右子树都分别为二叉搜索树
因此,我们再回头读取题目,有三种情况:
-
当 P.val => root.val 时,在右子树上查找
- P节点,有右子树
- P节点,无右子树,则返回Null
-
当 P.val < root.val 时,在左子树上查找比P.val大的节点
- 若在左子树上没有找到P.val的节点,则返回root.val
-
若在左子树上找到大于P.val的节点
根据上述的思路分析,解决该题可以使用 递归方法,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
三、总结:
本题仍然是关于二叉搜索树的题目,在该题目中我们要掌握二叉搜索树存储的数据都是有序数据的,并且左子树上的值小于右子树的值。
时间复杂度为O(n),空间复杂度O(N)
以上本期的内容,欢迎大佬们点赞评论,下期见~~