Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

(Please help me with Coding in Python3) AVLTree complete the following implementation of the balanced (AVL) binary search tree. Note that you should not be

(Please help me with Coding in Python3)

AVLTree

complete the following implementation of the balanced (AVL) binary search tree. Note that you should not be implementing the map-based API described in the plain (unbalanced) BSTree notebook i.e., nodes in the AVLTree will only contain a single value.

class AVLTree: class Node: def __init__(self, val, left=None, right=None): self.val = val self.left = left self.right = right

def rotate_right(self): n = self.left self.val, n.val = n.val, self.val self.left, n.left, self.right, n.right = n.left, n.right, n, self.right def rotate_left(self): # YOUR CODE HERE raise NotImplementedError() @staticmethod def height(n): if not n: return 0 else: return max(1+AVLTree.Node.height(n.left), 1+AVLTree.Node.height(n.right))

def __init__(self): self.size = 0 self.root = None @staticmethod def rebalance(t): # YOUR CODE HERE raise NotImplementedError() def add(self, val): assert(val not in self) # YOUR CODE HERE raise NotImplementedError() def __delitem__(self, val): assert(val in self) # YOUR CODE HERE raise NotImplementedError() def __contains__(self, val): def contains_rec(node): if not node: return False elif val < node.val: return contains_rec(node.left) elif val > node.val: return contains_rec(node.right) else: return True return contains_rec(self.root) def __len__(self): return self.size def __iter__(self): def iter_rec(node): if node: yield from iter_rec(node.left) yield node.val yield from iter_rec(node.right) yield from iter_rec(self.root) def pprint(self, width=64): """Attempts to pretty-print this tree's contents.""" height = self.height() nodes = [(self.root, 0)] prev_level = 0 repr_str = '' while nodes: n,level = nodes.pop(0) if prev_level != level: prev_level = level repr_str += ' ' if not n: if level < height-1: nodes.extend([(None, level+1), (None, level+1)]) repr_str += '{val:^{width}}'.format(val='-', width=width//2**level) elif n: if n.left or level < height-1: nodes.append((n.left, level+1)) if n.right or level < height-1: nodes.append((n.right, level+1)) repr_str += '{val:^{width}}'.format(val=n.val, width=width//2**level) print(repr_str) def height(self): """Returns the height of the longest branch of the tree.""" def height_rec(t): if not t: return 0 else: return max(1+height_rec(t.left), 1+height_rec(t.right)) return height_rec(self.root)

LL-fix (simple) test # 3 points

from unittest import TestCase

def height(t): if not t: return 0 else: return max(1+height(t.left), 1+height(t.right))

tc = TestCase() t = AVLTree()

for x in [3, 2, 1]: t.add(x) tc.assertEqual(height(t.root), 2) tc.assertEqual([t.root.left.val, t.root.val, t.root.right.val], [1, 2, 3])

# RR-fix (simple) test # 3 points

from unittest import TestCase

def height(t): if not t: return 0 else: return max(1+height(t.left), 1+height(t.right))

tc = TestCase() t = AVLTree()

for x in [1, 2, 3]: t.add(x) tc.assertEqual(height(t.root), 2) tc.assertEqual([t.root.left.val, t.root.val, t.root.right.val], [1, 2, 3])

# LR-fix (simple) test # 3 points

from unittest import TestCase

def height(t): if not t: return 0 else: return max(1+height(t.left), 1+height(t.right))

tc = TestCase() t = AVLTree()

for x in [3, 1, 2]: t.add(x) tc.assertEqual(height(t.root), 2) tc.assertEqual([t.root.left.val, t.root.val, t.root.right.val], [1, 2, 3])

# RL-fix (simple) test # 3 points

from unittest import TestCase

def height(t): if not t: return 0 else: return max(1+height(t.left), 1+height(t.right))

tc = TestCase() t = AVLTree()

for x in [1, 3, 2]: t.add(x) tc.assertEqual(height(t.root), 2) tc.assertEqual([t.root.left.val, t.root.val, t.root.right.val], [1, 2, 3])

# ensure key order is maintained after insertions and removals # 15 points

from unittest import TestCase import random

tc = TestCase() vals = list(range(0, 100000000, 333333)) random.shuffle(vals)

t = AVLTree() for x in vals: t.add(x)

for _ in range(len(vals) // 3): to_rem = vals.pop(random.randrange(len(vals))) del t[to_rem]

vals.sort()

for i,val in enumerate(t): tc.assertEqual(val, vals[i])

# stress testing # 15 points

from unittest import TestCase import random

tc = TestCase()

def traverse(t, fn): if t: fn(t) traverse(t.left, fn) traverse(t.right, fn)

def height(t): if not t: return 0 else: return max(1+height(t.left), 1+height(t.right)) def check_balance(t): tc.assertLess(abs(height(t.left) - height(t.right)), 2, 'Tree is out of balance')

t = AVLTree() vals = list(range(1000)) random.shuffle(vals) for i in range(len(vals)): t.add(vals[i]) for x in vals[:i+1]: tc.assertIn(x, t, 'Element added not in tree') traverse(t.root, check_balance)

random.shuffle(vals) for i in range(len(vals)): del t[vals[i]] for x in vals[i+1:]: tc.assertIn(x, t, 'Incorrect element removed from tree') for x in vals[:i+1]: tc.assertNotIn(x, t, 'Element removed still in tree') traverse(t.root, check_balance)

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image_2

Step: 3

blur-text-image_3

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Students also viewed these Databases questions

Question

How does selection differ from recruitment ?

Answered: 1 week ago