参考: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
def getLeftHeight(self):
if not self.left:
return 0
return self.left.treeHeight()
def getRightHeight(self):
if not self.right:
return 0
return self.right.treeHeight()
def treeHeight(self):
return max(0 if not self.left else self.left.treeHeight(), 0 if not self.right else self.right.treeHeight()) + 1
class AVLTree:
def __init__(self, root=None):
self.root = root
def _leftRotate(self):
if self.hasRootNode():
print("空树")
return
newNode = Node(self.root.value)
newNode.left = self.root.left
newNode.right = self.root.right.left
self.root.value = self.root.right.value
self.root.left = newNode
self.root.right = self.root.right.right
def _rightRotate(self):
if self.hasRootNode():
print("空树")
return
newNode = Node(self.root.value)
newNode.right = self.root.right
newNode.left = self.root.left.right
self.root.value = self.root.left.value
self.root.left = self.root.left.left
self.root.right = newNode
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)
if self.root.getRightHeight() - self.root.getLeftHeight() > 1:
if self.root.right and self.root.right.getLeftHeight() - self.root.right.getRightHeight() > 0:
tempNode = self.root
self.root = self.root.right
self._rightRotate()
self.root = tempNode
self._leftRotate()
return
if self.root.getLeftHeight() - self.root.getRightHeight() > 1:
if self.root.left and self.root.left.getRightHeight() - self.root.left.getLeftHeight() > 0:
tempNode = self.root
self.root = self.root.left
self._leftRotate()
self.root = tempNode
self._rightRotate()
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)
avlTree = AVLTree(Node(10))
avlTree.addNode(Node(5))
avlTree.addNode(Node(20))
avlTree.addNode(Node(11))
avlTree.addNode(Node(25))
avlTree.addNode(Node(15))
print(avlTree.root.treeHeight())
print(avlTree.root.getLeftHeight())
print(avlTree.root.getRightHeight())
avlTree.preOrder()