参考:www.bilibili.com/video/BV1E4…
python实现
class Node:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def __str__(self):
return f"node [value={self.value}]"
def preOrder(self, node):
if node is None:
return
else:
print(node)
if node.left:
node.left.preOrder(node.left)
if node.right:
node.right.preOrder(node.right)
def addNode(self, node):
if node is None or not isinstance(node, Node):
return
if self.value > node.value:
if self.left is None:
self.left = node
else:
self.left.addNode(node)
else:
if self.right is None:
self.right = node
else:
self.right.addNode(node)
def searchNode(self, value):
if self.value == value:
return self
else:
if self.left:
node = self.left.searchNode(value)
if node:
return node
if self.right:
node = self.right.searchNode(value)
if node:
return node
def getParentNode(self, value):
if (self.left and self.left.value == value) or (self.right and self.right.value == value):
return self
if self.value > value:
node = self.left.getParentNode(value)
if node:
return node
elif self.value < value:
node = self.right.getParentNode(value)
if node:
return node
else:
return None
class BinarySortTree:
def __init__(self, root=None):
self.root = root
def addNode(self, node):
if node is None or not isinstance(node, Node):
return
if self.hasRootNode():
self.root = node
else:
self.root.addNode(node)
def searchNode(self, value):
if not self.hasRootNode():
return self.root.searchNode(value)
else:
print("当前树为空")
def preOrder(self):
if not self.hasRootNode():
self.root.preOrder(self.root)
def hasRootNode(self):
return self.root is None
def getMinValue(self, node):
if node:
while node.left:
node = node.left
self.delNode(node.value)
return node.value
else:
print("node为空节点")
def delNode(self, value):
if self.hasRootNode():
print("树为空")
else:
targetNode = self.searchNode(value)
if not targetNode:
print("没有找到该节点")
return
if not self.root.left and not self.root.right:
self.root = None
return
parentNode = self.getParent(value)
if not targetNode.left and not targetNode.right:
if parentNode.left and parentNode.left.value == targetNode.value:
parentNode.left = None
elif parentNode.right and parentNode.right.value == targetNode.value:
parentNode.right = None
elif targetNode.left and targetNode.right:
targetNode.value = self.getMinValue(targetNode.right)
else:
if targetNode.left:
if parentNode:
if parentNode.left and parentNode.left.value == value:
parentNode.left = targetNode.left
else:
parentNode.right = targetNode.left
else:
self.root = targetNode.left
else:
if parentNode:
if parentNode.left and parentNode.left.value == value:
parentNode.left = targetNode.right
else:
parentNode.right = targetNode.right
else:
self.root = targetNode.right
def getParent(self, value):
if self.hasRootNode():
print("树为空")
else:
return self.root.getParentNode(value)
bst = BinarySortTree(Node(7))
bst.addNode(Node(3))
bst.addNode(Node(10))
bst.addNode(Node(12))
bst.addNode(Node(5))
bst.addNode(Node(1))
bst.addNode(Node(9))
bst.addNode(Node(2))
bst.preOrder()
print("=" * 20)
print(bst.searchNode(3))
print(bst.searchNode(7))
print(bst.searchNode(10))
print(bst.searchNode(12))
print(bst.searchNode(5))
print(bst.searchNode(1))
print(bst.searchNode(9))
print("=" * 20)
print(bst.getParent(7))
print(bst.getParent(3))
print(bst.getParent(10))
print(bst.getParent(12))
print(bst.getParent(5))
print(bst.getParent(1))
print(bst.getParent(9))
print("~" * 20)
bst.delNode(3)
bst.delNode(10)
bst.delNode(7)
bst.delNode(9)
bst.delNode(12)
bst.delNode(2)
bst.delNode(5)
bst.delNode(1)
bst.preOrder()
bst.addNode(Node(11))
bst.addNode(Node(22))
bst.preOrder()