def test_delitem(self): # CASE 1: LEAF - no cascading deletion, left rotation a = AVLTree() a[20] = 20 a[10] = 10 a[30] = 30 a[5] = 5 a[15] = 15 a[29] = 29 a[40] = 40 a[8] = 8 a[28] = 28 a[35] = 35 a[50] = 50 a[60] = 60 self.assertEqual(a.verbose_string(), 'AVL{5:5:-1, 8:8:0, 10:10:1, 15:15:0, 20:20:-1, 28:28:0, 29:29:1, 30:30:-1, 35:35:0, 40:40:-1, 50:50:-1, 60:60:0, }') del a[35] self.assertEqual(a.verbose_string(), 'AVL{5:5:-1, 8:8:0, 10:10:1, 15:15:0, 20:20:0, 28:28:0, 29:29:1, 30:30:0, 40:40:0, 50:50:0, 60:60:0, }') # CASE 2: LEAF - no cascading deletion, right left rotation # CASE 3: LEAF - cascading deletion, left following by right predecessor rotation a = AVLTree() a[20] = 20 a[10] = 10 a[30] = 30 a[5] = 5 a[15] = 15 a[29] = 29 a[40] = 40 a[3] = 3 a[8] = 8 a[13] = 13 a[18] = 18 a[28] = 28 a[35] = 35 a[50] = 50 a[2] = 2 a[9] = 9 a[12] = 12 a[14] = 14 a[19] = 19 a[60] = 60 a[11] = 11 self.assertEqual(a.verbose_string(), 'AVL{2:2:0, 3:3:1, 5:5:0, 8:8:-1, 9:9:0, 10:10:-1, 11:11:0, 12:12:1, 13:13:1, 14:14:0, 15:15:1, 18:18:-1, 19:19:0, 20:20:1, 28:28:0, 29:29:1, 30:30:-1, 35:35:0, 40:40:-1, 50:50:-1, 60:60:0, }') del a[35] self.assertEqual(a.verbose_string(), 'AVL{2:2:0, 3:3:1, 5:5:0, 8:8:-1, 9:9:0, 10:10:0, 11:11:0, 12:12:1, 13:13:1, 14:14:0, 15:15:0, 18:18:-1, 19:19:0, 20:20:-1, 28:28:0, 29:29:1, 30:30:0, 40:40:0, 50:50:0, 60:60:0, }')
def test_setitem(self): # CASE 1: into empty tree a = AVLTree() a[10] = 10 self.assertEqual(a.verbose_string(), 'AVL{10:10:0, }') # CASE 2: Root rotation - left a = AVLTree() a[10] = 10 a[5] = 5 a[15] = 15 a[13] = 13 a[20] = 20 self.assertEqual(a.verbose_string(), 'AVL{5:5:0, 10:10:-1, 13:13:0, 15:15:0, 20:20:0, }') a[25] = 25 self.assertEqual(a.verbose_string(), 'AVL{5:5:0, 10:10:0, 13:13:0, 15:15:0, 20:20:-1, 25:25:0, }') # CASE 3: Root rotation - right a = AVLTree() a[10] = 10 a[5] = 5 a[15] = 15 a[3] = 3 a[8] = 8 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:1, 15:15:0, }') a[2] = 2 self.assertEqual(a.verbose_string(), 'AVL{2:2:0, 3:3:1, 5:5:0, 8:8:0, 10:10:0, 15:15:0, }') # CASE 4: Root rotation - right left a = AVLTree() a[10] = 10 a[15] = 15 self.assertEqual(a.verbose_string(), 'AVL{10:10:-1, 15:15:0, }') a[13] = 13 self.assertEqual(a.verbose_string(), 'AVL{10:10:0, 13:13:0, 15:15:0, }') # CASE 5: Root rotation - left right a = AVLTree() a[10] = 10 a[5] = 5 self.assertEqual(a.verbose_string(), 'AVL{5:5:0, 10:10:1, }') a[8] = 8 self.assertEqual(a.verbose_string(), 'AVL{5:5:0, 8:8:0, 10:10:0, }') # CASE 6: Non-Root rotation - left a = AVLTree() a[10] = 10 a[5] = 5 a[3] = 3 a[8] = 8 a[15] = 15 a[13] = 13 a[20] = 20 a[18] = 18 a[25] = 25 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:-1, 13:13:0, 15:15:-1, 18:18:0, 20:20:0, 25:25:0, }') a[30] = 30 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:-1, 13:13:0, 15:15:0, 18:18:0, 20:20:0, 25:25:-1, 30:30:0, }') # CASE 7: Non-Root rotation - right a = AVLTree() a[10] = 10 a[5] = 5 a[3] = 3 a[8] = 8 a[15] = 15 a[13] = 13 a[18] = 18 a[12] = 12 a[14] = 14 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:-1, 12:12:0, 13:13:0, 14:14:0, 15:15:1, 18:18:0, }') a[11] = 11 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:-1, 11:11:0, 12:12:1, 13:13:0, 14:14:0, 15:15:0, 18:18:0, }') # CASE 8: Non-Root rotation - right left a = AVLTree() a[10] = 10 a[5] = 5 a[3] = 3 a[8] = 8 a[15] = 15 a[13] = 13 a[20] = 20 a[18] = 18 a[25] = 25 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:-1, 13:13:0, 15:15:-1, 18:18:0, 20:20:0, 25:25:0, }') a[17] = 17 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:-1, 13:13:0, 15:15:0, 17:17:0, 18:18:0, 20:20:-1, 25:25:0, }') # CASE 9: Non-Root rotation - left right a = AVLTree() a[10] = 10 a[5] = 5 a[3] = 3 a[8] = 8 a[16] = 16 a[13] = 13 a[18] = 18 a[12] = 12 a[14] = 14 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:-1, 12:12:0, 13:13:0, 14:14:0, 16:16:1, 18:18:0, }') a[15] = 15 self.assertEqual(a.verbose_string(), 'AVL{3:3:0, 5:5:0, 8:8:0, 10:10:-1, 12:12:0, 13:13:1, 14:14:0, 15:15:0, 16:16:0, 18:18:0, }')