class BTree: def __init__(self): self.root = None self.strategy = BTreeInsertStrategry() def Insert(self, v): node = Node(v) if self.root == None: self.root = node else: self.root.AddChild(node, self.strategy) def balanceTree(self, node): rh = node.GetRightHeight() lh = node.GetLeftHeight() print("rh:" + str(rh)) print("lh:" + str(lh)) if rh > lh + 1: if node == self.root: self.root = node.right node.RotateLeft() print "left rotated:" + str(node.value) elif lh > rh + 1: if node == self.root: self.root = node.left node.RotateRight() print "right rotated:" + str(node.value) class BTreeInsertStrategry: def InsertLeft(self, root, node): if root.value > node.value: return 1 else: return 0; class PreOrderPrinter: def printNode(self, root): if root != None: print(root.value) self.printNode(root.left) self.printNode(root.right) class AvlTreeBalancer: def balanceTree(self, node): rh = node.GetRightHeight() lh = node.GetLeftHeight() print("rh:" + str(rh)) print("lh:" + str(lh)) if rh > lh + 1: node.RotateLeft() print "left rotated:" + str(node.value) elif lh > rh + 1: node.RotateRight() print "right rotated:" + str(node.value) class Node: def __init__(self, v): self.left = None self.right = None self.root = None self.value = v self.height = 0 def GetRightHeight(self): if self.right == None: return 0 else: return 1 + self.right.height def GetLeftHeight(self): if self.left == None: return 0 else: return 1 + self.left.height def AddChild(self, node, strategy): if strategy.InsertLeft(self, node) == 1: if self.left == None: node.root = self self.left = node else: self.left.AddChild(node, strategy) else: if self.right == None: node.root = self self.right = node else: self.right.AddChild(node, strategy) self.UpdateHeights() def IsHeavyLeft(): return GetLeftHeight() > GetRightHeight() def IsHeavyRIght(): return GetRightHeight() < GetLeftHeight() def UpdateHeights(self): leftHeight = 0 rightHeight = 0 if self.left != None: self.left.UpdateHeights() leftHeight = 1 + self.left.height if self.right != None: self.right.UpdateHeights() rightHeight = 1 + self.right.height self.height = max(leftHeight, rightHeight) def RotateLeft(self): handshakeNode = self.right.left self.right.left = self self.right = handshakeNode def RotateRight(self): handshakeNode = self.left.right self.left.right = self self.left = handshakeNode data = [1,2,3] printer = PreOrderPrinter() btree = BTree() balancer = AvlTreeBalancer() for v in data: print("********************************************") btree.Insert(v) printer.printNode(btree.root) btree.balanceTree(btree.root) print("--------------------------------------------") printer.printNode(btree.root) print("++++++++++++++++++++++++++++++++++++++++++++") print "The End"
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question