Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. # Python code to insert a node in AVL tree
  2.  
  3. # Generic tree node class
  4. class TreeNode(object):
  5. def __init__(self, val):
  6. self.val = val
  7. self.left = None
  8. self.right = None
  9. self.height = 1
  10.  
  11. # AVL tree class which supports the
  12. # Insert operation
  13. class AVL_Tree(object):
  14.  
  15. # Recursive function to insert key in
  16. # subtree rooted with node and returns
  17. # new root of subtree.
  18. def insert(self, root, key):
  19.  
  20. # Step 1 - Perform normal BST
  21. if not root:
  22. return TreeNode(key)
  23. elif key < root.val:
  24. root.left = self.insert(root.left, key)
  25. else:
  26. root.right = self.insert(root.right, key)
  27.  
  28. # Step 2 - Update the height of the
  29. # ancestor node
  30. root.height = 1 + max(self.getHeight(root.left),
  31. self.getHeight(root.right))
  32.  
  33. # Step 3 - Get the balance factor
  34. balance = self.getBalance(root)
  35.  
  36. # Step 4 - If the node is unbalanced,
  37. # then try out the 4 cases
  38. # Case 1 - Left Left
  39. if balance > 1 and key < root.left.val:
  40. return self.rightRotate(root)
  41.  
  42. # Case 2 - Right Right
  43. if balance < -1 and key > root.right.val:
  44. return self.leftRotate(root)
  45.  
  46. # Case 3 - Left Right
  47. if balance > 1 and key > root.left.val:
  48. root.left = self.leftRotate(root.left)
  49. return self.rightRotate(root)
  50.  
  51. # Case 4 - Right Left
  52. if balance < -1 and key < root.right.val:
  53. root.right = self.rightRotate(root.right)
  54. return self.leftRotate(root)
  55.  
  56. return root
  57.  
  58. def leftRotate(self, z):
  59.  
  60. y = z.right
  61. T2 = y.left
  62.  
  63. # Perform rotation
  64. y.left = z
  65. z.right = T2
  66.  
  67. # Update heights
  68. z.height = 1 + max(self.getHeight(z.left),
  69. self.getHeight(z.right))
  70. y.height = 1 + max(self.getHeight(y.left),
  71. self.getHeight(y.right))
  72.  
  73. # Return the new root
  74. return y
  75.  
  76. def rightRotate(self, z):
  77.  
  78. y = z.left
  79. T3 = y.right
  80.  
  81. # Perform rotation
  82. y.right = z
  83. z.left = T3
  84.  
  85. # Update heights
  86. z.height = 1 + max(self.getHeight(z.left),
  87. self.getHeight(z.right))
  88. y.height = 1 + max(self.getHeight(y.left),
  89. self.getHeight(y.right))
  90.  
  91. # Return the new root
  92. return y
  93.  
  94. def getHeight(self, root):
  95. if not root:
  96. return 0
  97.  
  98. return root.height
  99.  
  100. def getBalance(self, root):
  101. if not root:
  102. return 0
  103.  
  104. return self.getHeight(root.left) - self.getHeight(root.right)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement