二叉搜索树(BST)又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和位置数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NIL)。根结点是树中唯一父指针为NULL的结点,而叶子结点的孩子结点指针也为NULL。 以上来自百度百科 实现代码如下
#encoding='utf-8'
class Node(object): #结点类
def __init__(self,data):
self.data = data
self.parent = None
self.lchild = None
self.rchild = None
class BST(object):
def __init__(self,node_list):
self.root = Node(node_list[0])
for data in node_list[1:]:
self.insert(data)
#查找一个具有给定关键字的结点
def search(self,data):
while self.root != None and data != self.root.data:
if data < self.root.data:
self.root = self.root.lchild
else:
self.root = self.root.rchild
return self.root
#插入一个具有给定关键字的节点
def insert(self,data):
z = Node(data)
y = None
x = self.root
while x != None:
y = x
if z.data < x.data:
x = x.lchild
else :
x = x.rchild
z.parent = y
if y == None:
self.root = z
elif z.data < y.data:
y.lchild = z
else:
y.rchild = z
#删除一个结点
def transplant(self,u,v):
if u.parent == None:
self.root = v
elif u == u.parent.lchild:
u.parent.lchild = v
else:
u.parent.rchild = v
if v != None:
v.parent = u.parent
def delete(self,z):
if z.lchild == None:
self.transplant(z,z.rchild)
elif z.rchild == None:
self.transplant(z,z.lchild)
else:
y = self.mininum(z.rchild)
if y.parent != z:
self.transplant(y,y.rchild)
y.rchild = z.rchild
y.rchild.parent = y
self.transplant(z,y)
y.lchild = z.lchild
y.lchild.parent = y
#查找最小关键字
def mininum(self,x):
while x.lchild != None:
x = x.lchild
return x
#查找最大关键字
def maxnum(self,x):
while x.rchild != None:
x = x.rchild
return x
#后继与前驱
def successor(self,x):
if x.rchild != None:
return self.mininum(x.rchild)
y = x.parent
while y != None and x == y.rchild:
x = y
y = y.parent
return y
#中序遍历
def inorder_tree_walk(self,x):
if x != None:
self.inorder_tree_walk(x.lchild)
print(x.data)
self.inorder_tree_walk(x.rchild)
if __name__ == "__main__":
BST_1 = BST([6,5,7,2,5,8])
BST_1.inorder_tree_walk(BST_1.root)
print('')
BST_1.delete(BST_1.root)
BST_1.inorder_tree_walk(BST_1.root)
输出结果:
2
5
5
6
7
8
2
5
5
7
8
如有错误,还望指正!