纯叶子节点删除
代码如下(考虑是不是根节点):
if not node.lchild and not node.rchild:
if not node.parent:
self.root=None
if node==node.parent.lchild:
node.parent.lchild=None
else:
node.parent.rchild=None
只有左孩子
代码如下:
elif not node.rchild:
if not node.parent:
self.root=node.lchild
node.lchild.parent=None
elif node==node.parent.lchild:
node.parent.lchild=node.lchild
node.lchild.parent=node.parent
else:
node.parent.rchild=node.lchild
node.lchild.parent=node.parent
只有右孩子
elif not node.lchild:
if not node.parent:
self.root=node.rchild
node.lchild.parent=None
elif node==node.parent.lchild:
node.parent.lchild=node.rchild
node.rchild.parent=node.parent
elif node==node.parent.rchild:
node.parent.rchild=node.rchild
node.rchild.parent=node.parent
左右孩子都有
代码如下:
else:
min_node=node.rchild
while min_node.lchild:
min_node=min_node.lchild
node.val=min_node.val
if min_node.rchild:
min_node.parent.lchild=min_node.rchild
min_node.rchild.parent=min_node.parent
else:
min_node.parent.lchild=None
综合代码如下:
class Node:
def __init__(self,val):
self.val=val
self.parent=None
self.lchild=None
self.rchild=None
class Tree:
def __init__(self):
self.root=None
def insert(self,val):
p=self.root
if not p:
self.root=Node(val)
return
while True:
if val>p.val:
if p.rchild:
p=p.rchild
else:
p.rchild=Node(val)
p.rchild.parent=p
return
elif val<p.val:
if p.lchild:
p=p.lchild
else:
p.lchild=Node(val)
p.lchild.parent=p
return
else:
return
def find(self,val):
p=self.root
while p:
if val>p.val:
p=p.rchild
elif val<p.val:
p=p.lchild
else:
return p
return None
def delete(self,val):
if self.root:
node=self.find(val)
if not node:
return False
if not node.lchild and not node.rchild:
if not node.parent:
self.root=None
if node==node.parent.lchild:
node.parent.lchild=None
else:
node.parent.rchild=None
elif not node.rchild:
if not node.parent:
self.root=node.lchild
node.lchild.parent=None
elif node==node.parent.lchild:
node.parent.lchild=node.lchild
node.lchild.parent=node.parent
else:
node.parent.rchild=node.lchild
node.lchild.parent=node.parent
elif not node.lchild:
if not node.parent:
self.root=node.rchild
node.lchild.parent=None
elif node==node.parent.lchild:
node.parent.lchild=node.rchild
node.rchild.parent=node.parent
elif node==node.parent.rchild:
node.parent.rchild=node.rchild
node.rchild.parent=node.parent
else:
min_node=node.rchild
while min_node.lchild:
min_node=min_node.lchild
node.val=min_node.val
if min_node.rchild:
min_node.parent.lchild=min_node.rchild
min_node.rchild.parent=min_node.parent
else:
min_node.parent.lchild=None