Binary Search Tree
每个node,比左child最大的大,比右child最小的小
Implementation
class _Node(object):
def __init__(self, key, value):
self.key = key
self.value = value
self.left = self.right = None
class BinarySearchTree(object):
def __init__(self):
self.__root = None
def __query(self, root, key):
if not root:
return None
if key<root.key:
return self.__query(root.left, key)
elif key>root.key:
return self.__query(root.right, key)
else:
return root.value
def query(self, key):
return self.__query(self.__root, key)
def FindMinimum(self, root):
if not root:
return None
return FindMinimum(self.left) or root
def FindFirstLargerThanTarget(self, root, target):
if not root:
return None
if root.value == target:
return self.FindMinimum(root.right)
elif root.value < target:
return self.FindFirstLargerThanTarget(root.right, target)
else:
return self.FindFirstLargerThanTarget(root.left, target) or root
def FindLastSmallerThanTarget(self, root, target):
pass
def insert(self, key, value):
self.__root = self.__insert(self.__root, key, value)
def __insert(self, root, key, value):
if not root:
return _Node(key, value) #这个时候就只是new了一个新的node
if key < root.key:
root.left = self.__insert(root.left, key, value) #在dereference这里才把那个new出来的node挂在对应的位置上
elif key > root.key:
root.right = self.__insert(root.right, key, value) #一个个往上挂回去 最后回去的时候就能回到正确的
else:
root.value = value
return root
# 如果没有等号/if里面是return,那么回去的只是这个node而已
# heap上:new出来了node,dereference的写
# 刚才的子树,怎么来怎么挂,无差别的写
# 如果return null 那么就做了pruning,一半的枝都没了
# 三部曲:所有判断往下走;下层返回的挂上去;操作完的结果通过return来report给上一层
def __deleteMin(self, root):
if not root.left:
return root.right
root.left = self.__deleteMin(root.left)
return root
def __delete(self, root, key):
if not root:
return None
if key < root.key:
root.left = self.__delete(root.left, key)
elif key > root.key:
root.right = self.__delete(root.right, key)
else:
if not root.right:
return root.left
if not root.left:
return root.right
t = root
root = self.__min(t.right)
root.right = self.__deleteMin(t.right)
root.left = t.left
return root
def delete(self, key):
self.__root = self.__delete(self.__root, key)检查是否BST
方法一: 从上往下传值
方法二:从下往上返值
方法三:inorder打印,应该ascending order
Create a BST from a sorted list of integers
利用BST的性质
BST版的LCA
BST版的search element
Range Sum of BST
Get Keys In Binary Search Tree In Given Range
Search in BST
Insert in BST
Delete
Last updated