二叉搜索树中的搜索
# 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 searchBST(self, root, val):
"""
:type root: TreeNode
:type val: int
:rtype: TreeNode
"""
if root is None:
return None
if root.val == val:
return root
if root.val > val:
return self.searchBST(root.left, val)
else:
return self.searchBST(root.right, val)
二叉树的插入操作:
# 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 insertIntoBST(self, root, val):
"""
:type root: TreeNode
:type val: int
:rtype: TreeNode
"""
if root is None:
root = TreeNode(val)
else:
if val < root.val:
root.left = self.insertIntoBST(root.left, val)
else:
root.right = self.insertIntoBST(root.right, val)
return root
二叉树的删除操作:
删除要比我们前面提到过的两种操作复杂许多。有许多不同的删除节点的方法,这篇文章中,我们只讨论一种使整体操作变化最小的方法。我们的方案是用一个合适的子节点来替换要删除的目标节点。根据其子节点的个数,我们需考虑以下三种情况:
1. 如果目标节点
没有子节点,我们可以直接移除该目标节点。
2. 如果目标节 只有一个子节点,我们可以用其子节点作为替换。
3. 如果目标节点 有两个子节点,我们需要用其中序后继节点或者前驱节点来替换,再删除该目标节点。
2. 如果目标节 只有一个子节点,我们可以用其子节点作为替换。
3. 如果目标节点 有两个子节点,我们需要用其中序后继节点或者前驱节点来替换,再删除该目标节点。
# 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 findmin(self, root):
if root.left:
return self.findmin(root.left)
else:
return root
def deleteNode(self, root, key):
"""
:type root: TreeNode
:type key: int
:rtype: TreeNode
"""
if root:
if key < root.val:
root.left = self.deleteNode(root.left, key)
elif key > root.val:
root.right = self.deleteNode(root.right, key)
elif root.left and root.right: #### 删除要区分左右孩子是否为空的情况
temp = self.findmin(root.right) ### 找到后继节点
root.val = temp.val
root.right = self.deleteNode(root.right, root.val) #### 实际删除的是这个后继节点,然后用其他值来代替这个位置
else:
if root.left is None:
root = root.right
elif root.right is None:
root = root.left
return root
二叉搜索树迭代器
实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。
调用 next()
将返回二叉搜索树中的下一个最小的数。
注意: next()
和hasNext()
操作的时间复杂度是O(1),并使用 O(h) 内存,其中 h 是树的高度。
代码如下:
# Definition for a binary tree node
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class BSTIterator(object):
def __init__(self, root):
"""
:type root: TreeNode
"""
self.cur = root
self.stack = []
def hasNext(self):
"""
:rtype: bool
"""
return self.stack or self.cur
def next(self):
"""
:rtype: int
"""
while self.cur:
self.stack.append(self.cur)
self.cur = self.cur.left
self.cur = self.stack.pop()
node = self.cur
self.cur = self.cur.right
return node.val
# Your BSTIterator will be called like this:
# i, v = BSTIterator(root), []
# while i.hasNext(): v.append(i.next())