Module: Lite::Containers::AvlTree::Balance
- Included in:
- Implementation
- Defined in:
- lib/lite/containers/avl_tree/balance.rb
Instance Method Summary collapse
- #balance_factor(node) ⇒ Object
- #height(node) ⇒ Object
-
#rebalance(node) ⇒ Object
rubocop:disable Metrics/AbcSize.
- #rotate_left(node) ⇒ Object
- #rotate_left_right(node) ⇒ Object
- #rotate_right(node) ⇒ Object
- #rotate_right_left(node) ⇒ Object
- #update_height(node) ⇒ Object
Instance Method Details
#balance_factor(node) ⇒ Object
64 65 66 |
# File 'lib/lite/containers/avl_tree/balance.rb', line 64 def balance_factor(node) height(node.right) - height(node.left) end |
#height(node) ⇒ Object
68 69 70 |
# File 'lib/lite/containers/avl_tree/balance.rb', line 68 def height(node) node&.height || 0 end |
#rebalance(node) ⇒ Object
rubocop:disable Metrics/AbcSize
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/lite/containers/avl_tree/balance.rb', line 7 def rebalance(node) # rubocop:disable Metrics/AbcSize case balance_factor(node) when -2 if height(node.left.right) > height(node.left.left) rotate_left_right(node) else rotate_right(node) end when 2 if height(node.right.left) > height(node.right.right) rotate_right_left(node) else rotate_left(node) end else update_height(node) node end end |
#rotate_left(node) ⇒ Object
27 28 29 30 31 32 33 34 |
# File 'lib/lite/containers/avl_tree/balance.rb', line 27 def rotate_left(node) right = node.right node.right = right.left right.left = node update_height node update_height right right end |
#rotate_left_right(node) ⇒ Object
50 51 52 53 |
# File 'lib/lite/containers/avl_tree/balance.rb', line 50 def rotate_left_right(node) node.left = rotate_left(node.left) rotate_right(node) end |
#rotate_right(node) ⇒ Object
36 37 38 39 40 41 42 43 |
# File 'lib/lite/containers/avl_tree/balance.rb', line 36 def rotate_right(node) left = node.left node.left = left.right left.right = node update_height node update_height left left end |
#rotate_right_left(node) ⇒ Object
45 46 47 48 |
# File 'lib/lite/containers/avl_tree/balance.rb', line 45 def rotate_right_left(node) node.right = rotate_right(node.right) rotate_left(node) end |
#update_height(node) ⇒ Object
55 56 57 58 59 60 61 62 |
# File 'lib/lite/containers/avl_tree/balance.rb', line 55 def update_height(node) left_height = height(node.left) right_height = height(node.right) # rubocop:disable Style/MinMaxComparison max = left_height > right_height ? left_height : right_height # rubocop:enable Style/MinMaxComparison node.height = max + 1 end |