二叉搜索树定义
- 二叉搜索树是一个二叉树
- 二叉搜索树中的任意节点都包含3个指针,分别指向该节点的父节点和左右孩子节点。
- 对于二叉搜索树中的任意节点,该节点的值大于等于非空左子树中任意节点的值且小于等于非空右子树中任意节点的值。
插入节点
如果插入值小于当前节点这进入左子树(如果左子树为空则把插入节点作为单前节点的左子树,插入完成),如果插入值大于等于当前节点则进入右子树(如果右子树为空则把插入节点作为单前节点的右子树,插入完成)。
删除节点
从一棵二叉搜索树删除一个结点分为三种基本情况:
- 如果该节点没有孩子结点,那么只是简单地将它删除,并修改它的父结点。
- 如果该节点只有一个孩子结点,那么将这个孩子提升到树中该节点的位置上。
- 如果该节点有两个孩子结点,那么找该节点的后继(大于该节点值的最小节点,也就是该节点右子树中的最小节点),并让后继占据树中该节点的位置。
总结
二叉查找树的效率和树的深度d有关,为O(d)。而二叉查找树容易退化成链表,也就是说二叉查找树最坏情况下时间复杂度是O(n)
python实现
class BST(object):
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def insert(self, root, val):
if root == None:
root = BST(val)
elif val < root.val:
root.left = self.insert(root.left, val)
else:
root.right = self.insert(root.right, val)
return root
def query(self, root, val):
if root == None:
return False;
elif root.val == val:
return True
elif val < root.val:
return self.query(root.left, val)
else:
return self.query(root.right, val)
def delNode(self, root, val):
if root == None:
return
if val < root.val:
root.left = self.delNode(root.left, val)
elif val > root.val:
root.right = self.delNode(root.right, val)
else:
if root.left == None and root.left == None:
root = None
elif root.left != None and root.right == None:
root = root.left
elif root.left == None and root.right != None:
root = root.right
elif root.left != None and root.right != None:
temp = self.findMin(root.right)
root.val = temp.val
root.right = self.delNode(root.right, temp.val)
return root
def findMin(self, root):
if root.left != None:
return self.findMin(root.left)
else:
return root
def printTree(self, root):
if root != None:
self.printTree(root.left)
print(root.val, end = ' ')
self.printTree(root.right)