Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

\'\'\'Provides basic operations for Binary Search Trees using a tuple representa

ID: 3812869 • Letter: #

Question

'''Provides basic operations for Binary Search Trees using
a tuple representation. In this representation, a BST is
either an empty tuple or a length-3 tuple consisting of a data value,
a BST called the left subtree and a BST called the right subtree
'''


def is_bintree(T):
    if type(T) is not tuple:
        return False
    if T == ():
        return True
    if len(T) != 3:
        return False
    if is_bintree(T[1]) and is_bintree(T[2]):
        return True
    return False

def bst_min(T):
    if T == ():
        return None
    if not T[1]:       
        return T[0]
    return bst_min(T[1])
   
def bst_max(T):
    if T == ():
        return None
    if not T[2]:       
        return T[0]
    return bst_max(T[2])
       
def is_bst(T):
    if not is_bintree(T):
        return False

    if T == ():
        return True

    if not is_bst(T[1]) or not is_bst(T[2]):
        return False
   
    if T[1] == () and T[2] == ():
        return True
   
    if T[2] == ():
        return bst_max(T[1]) < T[0]
    if T[1] == ():
        return T[0] < bst_min(T[2])
    return bst_max(T[1]) < T[0] < bst_min(T[2])
              
def bst_search(T,x):
    if T == ():
        return T
    if T[0] == x:
        return T
    if x < T[0]:
        return bst_search(T[1],x)
    return bst_search(T[2],x)

def bst_insert(T,x):
    if T == ():
        return (x,(),())
    elif x < T[0]:
        return (T[0],bst_insert(T[1],x),T[2])
    else:
        return (T[0],T[1],bst_insert(T[2],x))

def delete_min(T):
    if T == ():
        return T   
    if not T[1]:       
        return T[2]
    else:
        return (T[0],delete_min(T[1]),T[2])

def bst_delete(T,x):
    assert T, "deleting value not in tree"
           
    if x < T[0]:
        return (T[0],bst_delete(T[1],x),T[2])
    elif x > T[0]:
        return (T[0],T[1],bst_delete(T[2],x))
    else:
        # T[0] == x
        if not T[1]:
            return T[2]
        elif not T[2]:
            return T[1]
        else:
            return (bst_min(T[2]),T[1],delete_min(T[2]))

def print_bintree(T,indent=0):
    if not T:
        print('*')
        return
    else:
        print(T[0])
        print(' '*(indent + len(T[0])-1)+'---', end = '')
        print_bintree(T[1],indent+3)
        print(' '*(indent + len(T[0])-1)+'---', end = '')
        print_bintree(T[2],indent+3)     
   
def print_func_space(x):
    print(x,end=' ')

def inorder(T,f):
    if not is_bst(T):
        return
    if not T:
        return
    inorder(T[1],f)
    f(T[0])
    inorder(T[2],f)

# provide implementations for the functions below,
# i.e., replace all the pass statements in the functions below.
# Then add tests for these functions in the block
# that starts "if __name__ == '__main__':"


def preorder(T,f):
    pass

def postorder(T,f):
    pass

def tree_height(T):
    # Empty tree has height -1
    pass

def balance(T):
    # returns the height of the left subtree of T
    # minus the height of the right subtree of T
    # i.e., the balance of the root of T
    pass

def minBalance(T):
    # returns the minimum value of balance(S) for all subtrees S of T
    pass

def maxBalance(T):
    # returns the maximum value of balance(S) for all subtrees S of T
    pass

def is_avl(T):
    # Returns True if T is an AVL tree, False otherwise
    # Hint: use minBalance(T) and maxBalance(T)
    pass

# Add tests for the above seven functions below
if __name__ == '__main__':   
    K = ()  
    for x in ['Joe','Bob', 'Phil', 'Paul', 'Marc', 'Jean', 'Jerry', 'Alice', 'Anne']:
        K = bst_insert(K,x)

    print(' Tree elements in sorted order ')
    inorder(K,print_func_space)
    print()

    print(' Print full tree ')
    print_bintree(K)

    print(" Delete Bob and print tree ")
    K = bst_delete(K,'Bob')
    print_bintree(K)
    print()

    print(" Print subtree at 'Phil' ")
    print_bintree(bst_search(K,'Phil'))
    print()
   
    # TEST CODE FOR THE FUNCTIONS YOU IMPLEMENTED GOES BELOW:

Explanation / Answer

sbit DB7 = P1^7;
sbit DB6 = P1^6;
sbit DB5 = P1^5;
sbit DB4 = P1^4;
sbit RS = P1^3;
sbit E = P1^2;

sbit clear = P2^4;
sbit souse = P2^5;              
sbit left = P2^6;
sbit right = P2^7;

void returnHome(void);
void entryModeSet(bit id, bit s);
void showOnOffControl(bit display, bit cursor, bit blinking);
void cursorOrDisplayShift(bit sc, bit rl);
void functionSet(void);
void setDdRamAddress(char address);

void sendChar(char c);
void sendString(char* str);
bit getBit(char c, char bitNumber);
void delay(void);

void main(void) {

   functionSet();
   entryModeSet(1, 0); // increment and no shift
   displayOnOffControl(1, 1, 1); // show on, pointer on and blinking on
   sendString("EdSim51 LCD Module Simulation");
   setDdRamAddress(0x40); // set address to start out of second line
   sendString("Based on Hitachi HD44780");

   // The program will be controlled via a number of the switches on port a pair of.
   // If switch five is closed the pointer returns home (address 0).
   // Otherwise, switches six and seven ar scan - if each switches ar open or each switches
   // ar closed, the show doesn't shift.
   // If switch seven is closed, unceasingly shift left.
   // If switch six is closed, unceasingly shift right.
   whereas (1)
       else zero &amp;&amp; right == 1) {
               cursorOrDisplayShift(1, 0); // shift show left
           }
           else if (left == one &amp;&amp; right == 0) {
               cursorOrDisplayShift(1, 1); // shift show right
           }  
       }  
   }
}

// LCD Module directions -------------------------------------------
// to grasp why the pins ar being set to the actual values within the functions
// below, see the instruction set.
// A full rationalization of the LCD Module: HD44780.pdf

void returnHome(void)   

void entryModeSet(bit id, bit s)

void showOnOffControl(bit display, bit cursor, bit blinking)

void cursorOrDisplayShift(bit sc, bit rl)

void functionSet(void) operate set is really sent double. Why? See 4-bit operation
   // on pages thirty-nine and forty two of HD44780.pdf.
   DB7 = 0;
   DB6 = 0;
   DB5 = 1;
   DB4 = 0;
   RS = 0;
   E = 1;
   E = 0;
   delay();
   E = 1;
   E = 0;
   DB7 = 1;
   E = 1;
   E = 0;
   delay();
}

void setDdRamAddress(char address)

void sendChar(char c)

// -- finish of LCD Module directions
// --------------------------------------------------------------------

void sendString(char* str) {
   int index = 0;
   whereas (str[index] != 0)
}

bit getBit(char c, char bitNumber) come back (c &gt;&gt; bitNumber) &amp; 1;
}

void delay(void)