2006年07月13日 星期四 20:30
弄了一个很长的delete功能
def delete(self, key):
有什么办法弄滴短一点吗(见后面)?
而且很奇怪的是:
>>> newTree.printTree()
15
13
12
11
14
18
16
19
>>> newTree.delete(11)
>>> newTree.printTree()
# 11 根本没有被去掉,奇怪啊~~
15
13
12
11
14
18
16
19
class BinaryTree:
def __init__(self, key, left=None, right=None, parent=None):
self.key = key
self.left = left
self.right = right
self.parent = parent
def delete(self, key):
"""Delete a node from the tree.
"""
node=self.getNode(key)
if node:
if node.right and node.left:
# find left most node in right subtree
"""
newleft = self.getMinNode(node.key)
newleft.parent.left = None
newleft.parent.right = newleft.right
newleft.left = node.left
newleft.right = node.right
node.key = newleft.key
"""
subNode = self.getMinNode(node.key)
subNode.left = node.left
# find maximum in subnode
subMax = subNode.getMaxNode()
# set its right child to right child of node that will be
# deleted
subMax.right = node.right
node.right.left = None
node.key = subNode.key
node.right.parent = subMax
node.right = subNode.right
elif node.right:
# replace node with child tree/
node.key = node.right.key
try:
node.left = node.right.left
except:
node.left=None
try:
node.right = node.right.right
except:
node.right=None
elif node.left:
subNode= node.left
if node.parent:
if node.parent.left:
if node.parent.left == node:
node.parent.left = subNode
if node.parent.right:
if node.parent.right == node:
node.parent.right = subNode
else:
# at root
node.key = subNode.key
if subNode.left:
node.left=subNode.left
else:
node.left=None
if subNode.right:
node.right=subNode.right
else:
node.right=None
elif node.right:
subNode= node.right
if node.parent:
if node.parent.left:
if node.parent.left == node:
node.parent.left = subNode
if node.parent.right:
if node.parent.right == node:
node.parent.right = subNode
else:
node.key=subNode.key
if subNode.left:
node.left=subNode.left
else:
node.left=None
if subNode.right:
node.right=subNode.right
else:
node.right=None
else:
if node.parent:
if node.parent.left:
if node.parent.left == node:
node.parent.left=None
if node.parent.right:
if node.parent.right == node:
node.parent.right=None
else:
print 'no'
def addNode(self,key):
"""Add a node in the proper location."""
if key < self.key:
if self.left:
self.left.addNode(key)
else:
self.left = BinaryTree(key, parent=self)
elif key > self.key:
if self.right:
self.right.addNode(key)
else:
self.right = BinaryTree(key, parent=self)
def printTree(self):
print self.key
if self.left:
self.left.printTree()
if self.right:
self.right.printTree()
def getNode(self, key):
"""Get the node/subtree from the tree.
Returns
Node if node exisits
None if not
"""
if self.key == key:
return self
elif key < self.key:
if self.left:
return self.left.getNode(key)
else:
return
elif key > self.key:
if self.right:
return self.right.getNode(key)
else:
return
def getMaxNode(self):
"""return the maximum value node in the subtree"""
if self.right:
return self.right.getMaxNode()
else:
return self
def getMinNode(self,root=None):
"""return the minimum valued node in the subtree.
If root, then look for next largest value in the tree
"""
if root:
root = self.getNode(root)
tree = root.right
return tree.left.getMinNode()
if self.left:
return self.left.getMinNode()
else:
return self
Zeuux © 2025
京ICP备05028076号