面试题 04.06. 后继者
原始题目链接:https://leetcode-cn.com/problems/successor-lcci/
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。如果指定节点没有对应的“下一个”节点,则返回null。
解题思路:
解法一,利用二叉搜索树的性质,中序遍历的二叉搜索树是有序的序列,所以可以使用二分法进行解题。
解法二,比较好想,就是中序遍历二叉树的所有节点并且保存在一个数组中,在数组中查找要返回指定节点的索引,然后在数组中返回下一个节点即可。具体实现看代码及注释。
代码实现:
解法一
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def inorderSuccessor(self, root: TreeNode, p: TreeNode) -> TreeNode:
# 答案初始化为空
res = None
# 当前遍历到的节点
cur_node = root
# 使用二分法,判断遍历到的当前节点的值和指定的值的大小
while cur_node:
# 当前遍历到的节点的值小于等于指定节点的值
if cur_node.val <= p.val:
cur_node = cur_node.right
else:
res = cur_node
cur_node = cur_node.left
return res
解法二
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.node_list = []
# 中序遍历二叉搜索树工具函数
def in_order(self, nodes, root):
if root is None:
return None
self.in_order(nodes, root.left)
nodes.append(root)
self.in_order(nodes, root.right)
def inorderSuccessor(self, root: TreeNode, p: TreeNode) -> TreeNode:
if root is None:
return None
# 中序遍历二叉搜索树的节点,存储到数组中
self.in_order(self.node_list, root)
# 在中序遍历二叉树节点的数组中查找p的索引
p_index = self.node_list.index(p)
# 加个判断逻辑,返回p索引的下个节点就是题目要求返回的答案
if p_index + 1 < len(self.node_list):
return self.node_list[p_index + 1]
else:
return None
参考文献:
https://leetcode-cn.com/problems/successor-lcci/solution/er-fen-fa-olognshi-jian-o1kong-jian-by-ga-beng-cui/