原题
https://leetcode.com/problems/inorder-successor-in-bst/
解法1
先用中序遍历将二叉树的节点放到列表l 中, 然后遍历l , 找出p的下一个节点, 如果不存在就返回None.
Time: 2*O(n)
Space: O(n)
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def inorderSuccessor(self, root, p):
"""
:type root: TreeNode
:type p: TreeNode
:rtype: TreeNode
"""
def inOrder(root):
if not root:
return
inOrder(root.left)
l.append(root)
inOrder(root.right)
l = []
inOrder(root)
for i in range(len(l)):
if l[i] == p:
return l[i+1] if i+1 < len(l) else None
解法2
利用二叉搜索树的性质, 比p节点大的在它的右边, 我们只需找到比p节点值大的最小节点. 先将结果初始化为None, 如果p的值小于root, 那么我们更新结果为root, 然后往左边搜索, 当往右边搜索时, 我们不用更新结果, 因为要么之前已找到更小的结果, 要么还没找到比p节点的值更大的节点.
Time: O(h), h为树的高度
Space: O(1)
代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def inorderSuccessor(self, root, p):
"""
:type root: TreeNode
:type p: TreeNode
:rtype: TreeNode
"""
ans = None
while root:
if p.val < root.val:
ans = root
root = root.left
else:
root = root.right
return ans