def testcase4():
    print "testcase4"
    tree = RedBlackTree()
    bi_tree = BinarySearchTree()
    array = random.sample(string.uppercase[:26], 10)
    #array = ['E', 'D', 'L', 'G', 'F', 'H', 'A', 'I', 'B', 'C']
    # array = string.uppercase[:12][::-1]
    print array
    for char in array:
        tree.put(char, char)
        bi_tree.put(char, char)
        print char, tree.level_order_traversal()
        print tree.rank("A")
        
    print tree.level_order_traversal()
    print bi_tree.level_order_traversal()
    
    print tree.inorder_traversal()
        
    #print "search T:", tree.search("T")
    #print "search A:", tree.search("A")
    
    for char in array:
        print char, tree.rank(char), bi_tree.rank(char)
        
    print tree.range_size("A", "G")
    print bi_tree.range_size("D", "G")
    
    print bi_tree.range_node("D", "G")
def find_cross(h_lines, v_lines):
    h_queue, v_queue = build_queue(h_lines, v_lines)
    # print "h_queue", h_queue.get_keys()
    # print "v_queue", v_queue.get_keys()
    tree = BinarySearchTree()
    points = []
    while True:
        v_item = v_queue.pop()
        if v_item != None:
            print "scan", v_item.key
            delete_items = []
            h_item = h_queue.max()
            while h_item != None and h_item.key >= v_item.key:
                h_item = h_queue.pop()
                if type(h_item.value) != type(0):  # start node
                    if not tree.contains(h_item.value[0]):
                        print "insert", h_item.value[0], h_item.value[1]
                        tree.put(h_item.value[0], h_item.value[1])
                    else:  # overlapping start node
                        end = tree.search(h_item.value[0])
                        print "overlapping start", h_item.value[0]
                        if end > h_item.value[1]:
                            print "update", h_item.value[0], h_item.value[1]
                            tree.put(h_item.value[0], h_item.value[1])  # update the larger end
                        else:
                            print "drop inner section ", h_item.value[1], " within ", end
                else:  # end node
                    end = tree.search(h_item.value)
                    assert end <= h_item.key
                    if end == h_item.key:  # if it's the larger end, remove the y
                        print "catch the end", end
                        if h_item.key > v_item.key:
                            tree.hibbard_deletion(h_item.value)
                            print "remove", h_item.value, "scan", h_item.key
                        else:
                            delete_items.append(h_item.value)
                h_item = h_queue.max()
            assert v_item.value[1] >= v_item.value[0]
            nodes = tree.range_node(v_item.value[0], v_item.value[1])
            print "find node in range (", v_item.value[0], v_item.value[1], "):", nodes
            for node in nodes:
                points.append((v_item.key, node[0]))
            print "points", points
            print "tree", tree.level_order_traversal()
            print "remove", delete_items
            v_item_next = h_queue.max()
            if v_item_next != None and v_item_next.key < v_item.key:  # remove the y when v goes smaller
                for node in delete_items:
                    tree.hibbard_deletion(node)
        else:
            return points