二叉搜索树(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
如有错误,还望指正!