class TreeNode:
"""
树节点结构,加了左右子树的高度
"""
def __init__(self, data):
self.data = data
self.left = None
self.right = None
self.lheight = 0
self.rheight = 0
class BalanceTree:
def build(self, data):
root = TreeNode(data[0])
data = data[1:]
for i in data:
root = self.add(i, root)
self.midOrder(root)
return root
def midOrder(self, root):
if not root:
return
self.midOrder(root.left)
print(root.data)
self.midOrder(root.right)
def add(self, data, root):
nodeNew = TreeNode(data)
tmp, p, nodeTag, nodeTagF, tagF = root, root, None, None, None
while p:
tmp = p
if data < p.data:
p.lheight += 1
if abs(self.checkTree(p)) > 1:
nodeTag = p
nodeTagF = tagF
tagF = p if p.left else tagF
p = p.left
else:
p.rheight += 1
if abs(self.checkTree(p)) > 1:
nodeTag = p
nodeTagF = tagF
tagF = p if p.right else tagF
p = p.right
if data < tmp.data:
tmp.left = nodeNew
else:
tmp.right = nodeNew
if nodeTag != None:
if nodeTag == root:
return self.adjust(nodeTag)
else:
if nodeTagF.left == nodeTag:
balanceNode = self.adjust(nodeTag)
nodeTagF.left = balanceNode
nodeTagF.lheight = max(balanceNode.rheight, balanceNode.lheight)
else:
balanceNode = self.adjust(nodeTag)
nodeTagF.right = balanceNode
nodeTagF.rheight = max(balanceNode.rheight, balanceNode.lheight)
return root
def checkTree(self, root):
return root.lheight-root.rheight
def adjust(self, nodeTag):
tag = self.checkTree(nodeTag)
if tag == 2:
if self.checkTree(nodeTag.left) == 1:
return self.ll(nodeTag)
else:
return self.lr(nodeTag)
else:
if self.checkTree(nodeTag.right) == -1:
return self.rr(nodeTag)
else:
return self.rl(nodeTag)
def ll(self, node):
nodeRoot = node.left
nodeTmp = nodeRoot.right
nodeRoot.right = node
node.left = nodeTmp
node.lheight = 0 if not nodeTmp else max(nodeTmp.rheight, nodeTmp.lheight)
nodeRoot.rheight = max(node.rheight, node.lheight)
return nodeRoot
def rr(self, node):
nodeRoot = node.right
nodeTmp = nodeRoot.left
nodeRoot.left = node
node.right = nodeTmp
node.rheight = 0 if not nodeTmp else max(nodeTmp.rheight, nodeTmp.lheight)
nodeRoot.lheight = max(node.rheight, node.lheight)
return nodeRoot
def lr(self, node):
nodeRoot = node.left.right
nodeLtmp = nodeRoot.left
nodeRtmp = nodeRoot.right
nodeRoot.left = node.left
nodeRoot.right = node
node.left = nodeRtmp
nodeRoot.left.right = nodeLtmp
node.lheight = 0 if not nodeRtmp else max(nodeRtmp.rheight, nodeRtmp.lheight)
nodeRoot.left.rheight = 0 if not nodeLtmp else max(nodeLtmp.rheight, nodeLtmp.lheight)
nodeRoot.lheight = max(nodeRoot.left.lheight, nodeRoot.left.rheight)
nodeRoot.rheight = max(nodeRoot.right.lheight, nodeRoot.right.rheight)
return nodeRoot
def rl(self, node):
nodeRoot = node.right.left
nodeLtmp = nodeRoot.left
nodeRtmp = nodeRoot.right
nodeRoot.right = node.right
nodeRoot.left = node
node.right = nodeLtmp
nodeRoot.right.left = nodeRtmp
node.rheight = 0 if not nodeLtmp else max(nodeLtmp.rheight, nodeLtmp.lheight)
nodeRoot.right.lheight = 0 if not nodeRtmp else max(nodeRtmp.rheight, nodeRtmp.lheight)
nodeRoot.lheight = max(nodeRoot.left.lheight, nodeRoot.left.rheight)
nodeRoot.rheight = max(nodeRoot.right.lheight, nodeRoot.right.rheight)
return nodeRoot
if __name__ == '__main__':
ll = [4,2,5,6,1,9,3,8,7]
ss = BalanceTree()
ss.build(ll)