class TreeNode:
"""
二叉搜索树的建立
二叉搜索树和每一个二叉树一样都有一个存储节点本身数据的变量还有两个存储左右孩子的变量
"""
def __init__(self, val):
"""
:param val:根节点本身
:param _left:左孩子节点
:param _right:右孩子节点
"""
self._val = val
self._left = None
self._right = None
class BST:
"""
定义二叉搜索树,假设所有元素都已列表的形式输入,我们可以在类内的init()函数中初始化
"""
def __init__(self, tlist):
"""
:param tlist:以列表的形式展现
"""
self._root = TreeNode(tlist[0])
for i in tlist[1:]:
self.insert(i)
def search(self, node, parent, data):
"""
:param node:最后的节点node
:param parent:父节点
:param data:输入的值
:return:二叉搜索树中查找是否有键值为 val 的节点。如果有,返回节点的位置;如果没有,返回 0
"""
if node is None:
return 0, node, parent
elif data == node.data:
return 1, node, parent
elif data < node.data:
return self.search(node.left, node, data)
elif data > node.data:
return self.search(node.right, node, data)
def insert(self, data):
"""
如果二叉搜索树中节点的键值没有与要插入的元素重合,那么一定会有这样一个唯一的空位供新节点插入;
反之,如果有重合的节点,那么一定会被查找到。这时候,不需要插入,直接 return 退出函数即可。
:param data:插入的值
:return:
"""
exist, n, p = self.search(self._root, self._root, data)
if exist:
return
else:
new_code = TreeNode(data)
if data > p.data:
p.right = new_code
else:
p.left = new_code
def getlast(self, node, data, maxn):
"""
:param node:最后的节点node
:param data: 输入的值
:param maxn:最大的符合前驱要求的数
:return:
"""
if node is None:
return 0, maxn
elif data == node.data:
if node.left == None:
return 1, maxn
else:
tmp = node.left
while tmp.right is not None:
tmp = tmp.right
return 1, tmp
elif data < node.data:
return self.getlast(node.left, data, maxn)
else:
if maxn.data < node.data:
maxn = node
return self.getlast(node.right, data, maxn)
def getnext(self, node, data, minn):
if node is None:
return 0, minn
elif data == node.data:
if node.right == None:
return 1, minn
else:
tmp = node.right
while tmp.right is not None:
tmp = tmp.right
return 1, tmp
elif data < node.data:
if minn.data > node.data:
minn = node
return self.getlast(node.left, data, minn)
else:
return self.getlast(node.right, data, minn)
def delete(self, root, data):
exist, n, p = self.search(root, root, data)
if not exist:
return '数据不存在'
else:
if n.left is None:
if n == p.left:
p.left = n.left
if n == p.right:
p.right = n.left
del n
else:
tmp = n.right
if tmp.left is None:
n.data = tmp.data
n.right = tmp.right
del tmp
else:
next = tmp.left
while next.left is not None:
tmp = next
next = next.left
n.data = next.data
tmp.left = next.right
del next