二叉排序树的实现(python)
2017-06-28 10:29
260 查看
二叉排序树,又叫二叉搜索树,二叉查找树。
二叉搜索树中比较复杂的就是删除操作,我的删除操作写的最笨了,代码比较幼稚,但是对于初学者很容易看懂。看懂了之后再进行优化。因为我也是初学,网上大神的方法看不懂。。。就自己按照操作写了一个
,所以写的不是很好。
想验证自己写的对不对,所以又写了一个前序遍历。
class Node:
def __init__(self,data):
self.data = data
self.lchild = None
self.rchild = None
class BST:
def __init__(self,node_list):
self.root = None
for node in node_list:
self.insert(node)
def search(self,data):
bt = self.root
while bt:
entry = bt.data
if data < entry:
bt = bt.lchild
elif data > entry:
bt = bt.rchild
else:
return entry
return False
def insert(self,data):
bt = self.root
if not bt:
self.root = Node(data)
return
while True:
entry = bt.data
if data < entry:
if bt.lchild is None:
bt.lchild = Node(data)
return
bt = bt.lchild
elif data > entry:
if bt.rchild is None:
bt.rchild = Node(data)
return
bt = bt.rchild
else:
bt.data = data
return
def front_visit(self,root):
if root == None:
return
print(root.data)
self.front_visit(root.lchild)
self.front_visit(root.rchild)
def delete(self,data):
parent, node = None, self.root
if not node:
print("the tree is null")
return False
while node and node.data != data:
parent = n
4000
ode
if data < node.data:
node = node.lchild
else:
node = node.rchild
if not node:
return
if parent != None and parent.lchild == node:
if node.lchild is None and node.rchild is None:
parent.lchild = None
del node
elif node.lchild != None and node.rchild is None:
parent.lchild = node.lchild
del node
elif node.rchild != None and node.lchild is None:
parent.lchild = node.rchild
del node
elif node.rchild != None and node.lchild != None:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
r.lchild = node.lchild
r.rchild = node.rchild
parent.lchild = r
p.rchild = None
del node
elif parent != None and parent.rchild == node:
if node.lchild is None and node.rchild is None:
parent.rchild = None
elif node.lchild != None and node.rchild is None:
parent.rchild = node.lchild
elif node.rchild != None and node.lchild is None:
parent.rchild = node.rchild
elif node.rchild != None and node.lchild != None:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
r.lchild = node.lchild
r.rchild = node.rchild
p.rchild = None
parent.rchild = r
del node
elif parent is None:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
# return r.data,node.data
r.lchild = node.lchild
r.rchild = node.rchild
p.rchild = None
self.root = r
del node
删除分四种情况,第一种是删除叶子节点,就可以直接删了。第二种是删除只有一个孩子的节点,需要将删除节点的孩子节点补到删除节点的位置就好了。第三种是删除有两个孩子的,有两种做法,一个是选择删除节点的左子树的最大值来补上,另一个是选择删除节点的右子树的最小值来补上。注意需要将最大值的父亲的右孩子置为None,或者将最小值的父亲的左孩子置为None,还要注意补上的那个节点要继承上删除节点的左右孩子和删除父节点的链接。第四种是第三种的特殊情况,就是删除的节点是root的时候,因为删除操作除了要记录删除节点的信息外,还要记录父亲节点的信息。但是root的无父亲节点,只需要取左树最大或者右树最小的值来补上,然后操作同第三种,最后要将树的root设置为替换后的节点。要不然这个树就没有root了哦。
二叉搜索树中比较复杂的就是删除操作,我的删除操作写的最笨了,代码比较幼稚,但是对于初学者很容易看懂。看懂了之后再进行优化。因为我也是初学,网上大神的方法看不懂。。。就自己按照操作写了一个
,所以写的不是很好。
想验证自己写的对不对,所以又写了一个前序遍历。
class Node:
def __init__(self,data):
self.data = data
self.lchild = None
self.rchild = None
class BST:
def __init__(self,node_list):
self.root = None
for node in node_list:
self.insert(node)
def search(self,data):
bt = self.root
while bt:
entry = bt.data
if data < entry:
bt = bt.lchild
elif data > entry:
bt = bt.rchild
else:
return entry
return False
def insert(self,data):
bt = self.root
if not bt:
self.root = Node(data)
return
while True:
entry = bt.data
if data < entry:
if bt.lchild is None:
bt.lchild = Node(data)
return
bt = bt.lchild
elif data > entry:
if bt.rchild is None:
bt.rchild = Node(data)
return
bt = bt.rchild
else:
bt.data = data
return
def front_visit(self,root):
if root == None:
return
print(root.data)
self.front_visit(root.lchild)
self.front_visit(root.rchild)
def delete(self,data):
parent, node = None, self.root
if not node:
print("the tree is null")
return False
while node and node.data != data:
parent = n
4000
ode
if data < node.data:
node = node.lchild
else:
node = node.rchild
if not node:
return
if parent != None and parent.lchild == node:
if node.lchild is None and node.rchild is None:
parent.lchild = None
del node
elif node.lchild != None and node.rchild is None:
parent.lchild = node.lchild
del node
elif node.rchild != None and node.lchild is None:
parent.lchild = node.rchild
del node
elif node.rchild != None and node.lchild != None:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
r.lchild = node.lchild
r.rchild = node.rchild
parent.lchild = r
p.rchild = None
del node
elif parent != None and parent.rchild == node:
if node.lchild is None and node.rchild is None:
parent.rchild = None
elif node.lchild != None and node.rchild is None:
parent.rchild = node.lchild
elif node.rchild != None and node.lchild is None:
parent.rchild = node.rchild
elif node.rchild != None and node.lchild != None:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
r.lchild = node.lchild
r.rchild = node.rchild
p.rchild = None
parent.rchild = r
del node
elif parent is None:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
# return r.data,node.data
r.lchild = node.lchild
r.rchild = node.rchild
p.rchild = None
self.root = r
del node
删除分四种情况,第一种是删除叶子节点,就可以直接删了。第二种是删除只有一个孩子的节点,需要将删除节点的孩子节点补到删除节点的位置就好了。第三种是删除有两个孩子的,有两种做法,一个是选择删除节点的左子树的最大值来补上,另一个是选择删除节点的右子树的最小值来补上。注意需要将最大值的父亲的右孩子置为None,或者将最小值的父亲的左孩子置为None,还要注意补上的那个节点要继承上删除节点的左右孩子和删除父节点的链接。第四种是第三种的特殊情况,就是删除的节点是root的时候,因为删除操作除了要记录删除节点的信息外,还要记录父亲节点的信息。但是root的无父亲节点,只需要取左树最大或者右树最小的值来补上,然后操作同第三种,最后要将树的root设置为替换后的节点。要不然这个树就没有root了哦。
相关文章推荐
- 对于一颗满二叉排序树深度为K,求最小子树根节点值 Python代码实现
- 二叉排序树(C与Python分别实现)
- python实现-满二叉排序树中查找三个节点的最小子树的根节点
- 发布一个用Python实现的“法语动词变位工具”
- Python实现ASP+ACCESS注入,不用SOCKET
- Python使用Com组件及Access查询分析类实现
- IronPython0.9.4发布了 —— 实现静态编译并提供官方Tutorial
- 用Python实现GB与BIG5码的转换
- 用Python实现数据库编程
- python实现文件传输
- C语言-数据结构-二叉排序树与平衡树算法实现及演示
- python实现的AES双向对称加密解密与用法分析
- ·python·用生成器和迭代器实现自己的xrange
- 用Python实现去掉文章中特定的段落
- Python实现的在线保持
- 发布一个用Python实现的“法语动词变位工具”
- C#下的webservcie 实现代码和 在vc和python下的调用实现(原创)
- [转载]Python实现ASP+ACCESS注入的工具源代码
- [Python]Python中实现一个时间(日期)型加几个月的运算
- Python实现博客日志自动提交程序