In [1]:
from tree import *
from IPython.display import display
import random
In [2]:
#  Struktura pro reprezentaci uzlu stromu Tree.
#  'key' je klic uzlu
#  'S' je hodnota S daneho uzlu.
#  'b' urcuje barvu uzlu
#
#  'left' je levy syn, tedy atribut typu Node, pokud syn existuje, jinak None
#  'right' analogicky jako left
class Node:
    def __init__(self):
        self.key = None
        self.S = None
        self.b = None
        self.left = None
        self.right = None

Obecné poznámky

  • Třída Tree obsahuje parametr root - kořen stromu.
  • Nastovování hodnot do node.S či node.b je často pouze pro účely vizualizace toho, co se ze kterého uzlu vrací a v klasických programech bychom tyto hodnoty nenastavovali, jen je propagovali nahoru pomocí return.
  • Sekvence příkazů ret = f(tree); display(tree); return ret ve funkce f, která má vracet něco jiného než strom, je použita rovněž pro účely vizualizace, typicky bychom je nahradili příkazem return f(tree).

Vytvoření ukázkových stromů

In [3]:
small_seq = [3,5,9,None,6,None,None,None,None,12]
small = makeHeap(small_seq)
small
Out[3]:
Tree 3 3 5 5 3->5 9 9 3->9 L139753741741640 5->L139753741741640 6 6 5->6 12 12 6->12 R139753741741696 6->R139753741741696 L139753741741752 12->L139753741741752 R139753741741752 12->R139753741741752 L139753741741808 9->L139753741741808 R139753741741808 9->R139753741741808
In [4]:
big_seq = random.sample(range(100), 30)
big_seq[4] = None
big_seq[6] = None
big_seq[16] = None
big_seq[23] = None
big_seq[24] = None
In [5]:
big = makeHeap(big_seq);
big
Out[5]:
Tree 6 6 29 29 6->29 48 48 6->48 70 70 29->70 R139753741741864 29->R139753741741864 60 60 70->60 45 45 70->45 80 80 60->80 R139753741741976 60->R139753741741976 L139753741739288 80->L139753741739288 R139753741739288 80->R139753741739288 84 84 45->84 42 42 45->42 L139753741738672 84->L139753741738672 R139753741738672 84->R139753741738672 L139753741738616 42->L139753741738616 R139753741738616 42->R139753741738616 73 73 48->73 R139753741739512 48->R139753741739512 87 87 73->87 61 61 73->61 L139753741739568 87->L139753741739568 R139753741739568 87->R139753741739568 47 47 61->47 74 74 61->74 L139753741739736 47->L139753741739736 R139753741739736 47->R139753741739736 L139753741739624 74->L139753741739624 R139753741739624 74->R139753741739624

Jednoduchá rekurze bez předávání informací

  • každému uzlu se od atributu S přiřadí 0.
  • hlavní práci odvádí pomocná funkce fill_zeros_n, která funguje nad jednotlivými uzly
In [6]:
def fill_zeros_n(node):
    if node is None:
        return
    node.S = 0
    fill_zeros_n(node.left)
    fill_zeros_n(node.right)

def fill_zeros(tree):
    fill_zeros_n(tree.root)
    return tree
In [7]:
fill_zeros(small)
Out[7]:
Tree 3 3 S=0 5 5 S=0 3->5 9 9 S=0 3->9 L139753741741640 5->L139753741741640 6 6 S=0 5->6 12 12 S=0 6->12 R139753741741696 6->R139753741741696 L139753741741752 12->L139753741741752 R139753741741752 12->R139753741741752 L139753741741808 9->L139753741741808 R139753741741808 9->R139753741741808

Upravit tak, abychom mohli ulozit libovolnou hodnotu

In [8]:
def fill_n(node, value):
    if node is None:
        return
    node.S = value
    fill_n(node.left, value)
    fill_n(node.right, value)

def fill(tree, value):
    fill_n(tree.root, value)
    return tree
In [9]:
fill(small, 3)
Out[9]:
Tree 3 3 S=3 5 5 S=3 3->5 9 9 S=3 3->9 L139753741741640 5->L139753741741640 6 6 S=3 5->6 12 12 S=3 6->12 R139753741741696 6->R139753741741696 L139753741741752 12->L139753741741752 R139753741741752 12->R139753741741752 L139753741741808 9->L139753741741808 R139753741741808 9->R139753741741808

Informace zhora dolů

  • předává se pomocí parametrů pomocné funkce
In [10]:
def fill_depth_n(node, value):
    if node is None:
        return
    node.S = value
    fill_depth_n(node.left, value + 1)
    fill_depth_n(node.right, value + 1)
    
    
def fill_depth(tree):
    fill_depth_n(tree.root, 0)
    return tree
In [11]:
fill_depth(big)
Out[11]:
Tree 6 6 S=0 29 29 S=1 6->29 48 48 S=1 6->48 70 70 S=2 29->70 R139753741741864 29->R139753741741864 60 60 S=3 70->60 45 45 S=3 70->45 80 80 S=4 60->80 R139753741741976 60->R139753741741976 L139753741739288 80->L139753741739288 R139753741739288 80->R139753741739288 84 84 S=4 45->84 42 42 S=4 45->42 L139753741738672 84->L139753741738672 R139753741738672 84->R139753741738672 L139753741738616 42->L139753741738616 R139753741738616 42->R139753741738616 73 73 S=2 48->73 R139753741739512 48->R139753741739512 87 87 S=3 73->87 61 61 S=3 73->61 L139753741739568 87->L139753741739568 R139753741739568 87->R139753741739568 47 47 S=4 61->47 74 74 S=4 61->74 L139753741739736 47->L139753741739736 R139753741739736 47->R139753741739736 L139753741739624 74->L139753741739624 R139753741739624 74->R139753741739624

Rekurzivní volání pro levého a pravého potomka mohou dostat jiné parametry

  • Zelená barva uzlu znamená, že má nastaven atribut b na True, červená analogicky pro False, modrá odpovídá node.b == None.
  • Zelené jsou ty uzly, jež jsou levým následníkem svého otce.
In [12]:
def fill_direction_n(node, is_left):
    if node is None:
        return
    node.b = is_left
    fill_direction_n(node.left, True)
    fill_direction_n(node.right, False)
    
    
def fill_direction(tree):
    fill_direction_n(tree.root, None)
    return tree
In [13]:
fill_direction(makeHeap(big_seq))
Out[13]:
Tree 6 6 29 29 6->29 48 48 6->48 70 70 29->70 R139753741740352 29->R139753741740352 60 60 70->60 45 45 70->45 80 80 60->80 R139753741740800 60->R139753741740800 L139753741740184 80->L139753741740184 R139753741740184 80->R139753741740184 84 84 45->84 42 42 45->42 L139753741739680 84->L139753741739680 R139753741739680 84->R139753741739680 L139753741741192 42->L139753741741192 R139753741741192 42->R139753741741192 73 73 48->73 R139753741740744 48->R139753741740744 87 87 73->87 61 61 73->61 L139753741741248 87->L139753741741248 R139753741741248 87->R139753741741248 47 47 61->47 74 74 61->74 L139753741740464 47->L139753741740464 R139753741740464 47->R139753741740464 L139753741852624 74->L139753741852624 R139753741852624 74->R139753741852624

Propagace informací zdola nahoru

  • Předává se návratovou hodnotou.
  • Pokud hodnotu nijak nevyužijeme, informace je ztracena.
In [14]:
def tree_height_n(node):
    if node is None:
        return -1
    l = tree_height_n(node.left)
    r = tree_height_n(node.right)
    node.S = max(l,r) + 1
    return node.S

def tree_height(tree):
    ret = tree_height_n(tree.root)
    display(tree)
    return ret
In [15]:
tree_height(makeHeap(small_seq))
Tree 3 3 S=3 5 5 S=2 3->5 9 9 S=0 3->9 L139753741869408 5->L139753741869408 6 6 S=1 5->6 12 12 S=0 6->12 R139753741869576 6->R139753741869576 L139753741869632 12->L139753741869632 R139753741869632 12->R139753741869632 L139753741869688 9->L139753741869688 R139753741869688 9->R139753741869688
Out[15]:
3

Kombinace - nejprve dolů, potom zpět nahoru

Nejprve špatný pokus

Informace o délce větve se správně spočítá a vrací, nicméně není zachycena v rodiči.

In [16]:
def tree_height_bad_n(node, value):
    if node is None:
        return value-1
    tree_height_bad_n(node.left, value + 1)
    tree_height_bad_n(node.right, value + 1)
    node.S = value
    return node.S
    
    
def tree_height_bad(tree):
    ret = tree_height_bad_n(tree.root, 0)
    display(tree)
    return ret
In [17]:
tree_height_bad(small)
Tree 3 3 S=0 5 5 S=1 3->5 9 9 S=1 3->9 L139753741741640 5->L139753741741640 6 6 S=2 5->6 12 12 S=3 6->12 R139753741741696 6->R139753741741696 L139753741741752 12->L139753741741752 R139753741741752 12->R139753741741752 L139753741741808 9->L139753741741808 R139753741741808 9->R139753741741808
Out[17]:
0

Korektní řešení, které hodnoty vrácené z potomků zachytí a zpracuje

In [18]:
def tree_height2_n(node, value):
    if node is None:
        return value-1
    l = tree_height2_n(node.left, value + 1)
    r = tree_height2_n(node.right, value + 1)
    node.S = max(l, r)
    return node.S
    
    
def tree_height2(tree):
    ret = tree_height2_n(tree.root, 0)
    display(tree)
    return ret
In [19]:
tree_height2(small)
Tree 3 3 S=3 5 5 S=3 3->5 9 9 S=1 3->9 L139753741741640 5->L139753741741640 6 6 S=3 5->6 12 12 S=3 6->12 R139753741741696 6->R139753741741696 L139753741741752 12->L139753741741752 R139753741741752 12->R139753741741752 L139753741741808 9->L139753741741808 R139753741741808 9->R139753741741808
Out[19]:
3
In [20]:
def has_all_zeros_n(node):
    if node is None:
        return True
    l = has_all_zeros_n(node.left)
    r = has_all_zeros_n(node.right)
    this = node.S == 0
    node.b = this and l and r
    return node.b

def has_all_zeros(tree):
    ret = has_all_zeros_n(tree.root)
    display(tree)
    return ret
In [21]:
big = makeHeap(big_seq)
fill_zeros(big)
has_all_zeros(big)
Tree 6 6 S=0 29 29 S=0 6->29 48 48 S=0 6->48 70 70 S=0 29->70 R139753741850496 29->R139753741850496 60 60 S=0 70->60 45 45 S=0 70->45 80 80 S=0 60->80 R139753741849488 60->R139753741849488 L139753741849320 80->L139753741849320 R139753741849320 80->R139753741849320 84 84 S=0 45->84 42 42 S=0 45->42 L139753741851448 84->L139753741851448 R139753741851448 84->R139753741851448 L139753741851504 42->L139753741851504 R139753741851504 42->R139753741851504 73 73 S=0 48->73 R139753741851560 48->R139753741851560 87 87 S=0 73->87 61 61 S=0 73->61 L139753741849208 87->L139753741849208 R139753741849208 87->R139753741849208 47 47 S=0 61->47 74 74 S=0 61->74 L139753741850608 47->L139753741850608 R139753741850608 47->R139753741850608 L139753741851616 74->L139753741851616 R139753741851616 74->R139753741851616
Out[21]:
True
In [22]:
big.root.right.left.right.S = 5
big.root.right.left.left.S = 3
has_all_zeros(big)
Tree 6 6 S=0 29 29 S=0 6->29 48 48 S=0 6->48 70 70 S=0 29->70 R139753741850496 29->R139753741850496 60 60 S=0 70->60 45 45 S=0 70->45 80 80 S=0 60->80 R139753741849488 60->R139753741849488 L139753741849320 80->L139753741849320 R139753741849320 80->R139753741849320 84 84 S=0 45->84 42 42 S=0 45->42 L139753741851448 84->L139753741851448 R139753741851448 84->R139753741851448 L139753741851504 42->L139753741851504 R139753741851504 42->R139753741851504 73 73 S=0 48->73 R139753741851560 48->R139753741851560 87 87 S=3 73->87 61 61 S=5 73->61 L139753741849208 87->L139753741849208 R139753741849208 87->R139753741849208 47 47 S=0 61->47 74 74 S=0 61->74 L139753741850608 47->L139753741850608 R139753741850608 47->R139753741850608 L139753741851616 74->L139753741851616 R139753741851616 74->R139753741851616
Out[22]:
False

Informace z potomků je kombinována s aktuálním uzlem

In [23]:
def has_zero_branch_n(node):
    if node is None:
        return True
    l = has_zero_branch_n(node.left)
    r = has_zero_branch_n(node.right)
    this = node.S == 0
    node.b = this and (l or r)
    return node.b

def has_zero_branch(tree):
    ret = has_zero_branch_n(tree.root)
    display(tree)
    return ret
In [24]:
has_zero_branch(big)
Tree 6 6 S=0 29 29 S=0 6->29 48 48 S=0 6->48 70 70 S=0 29->70 R139753741850496 29->R139753741850496 60 60 S=0 70->60 45 45 S=0 70->45 80 80 S=0 60->80 R139753741849488 60->R139753741849488 L139753741849320 80->L139753741849320 R139753741849320 80->R139753741849320 84 84 S=0 45->84 42 42 S=0 45->42 L139753741851448 84->L139753741851448 R139753741851448 84->R139753741851448 L139753741851504 42->L139753741851504 R139753741851504 42->R139753741851504 73 73 S=0 48->73 R139753741851560 48->R139753741851560 87 87 S=3 73->87 61 61 S=5 73->61 L139753741849208 87->L139753741849208 R139753741849208 87->R139753741849208 47 47 S=0 61->47 74 74 S=0 61->74 L139753741850608 47->L139753741850608 R139753741850608 47->R139753741850608 L139753741851616 74->L139753741851616 R139753741851616 74->R139753741851616
Out[24]:
True
In [25]:
big.root.left.S = 4
big.root.right.S = 3
has_zero_branch(big)
Tree 6 6 S=0 29 29 S=4 6->29 48 48 S=3 6->48 70 70 S=0 29->70 R139753741850496 29->R139753741850496 60 60 S=0 70->60 45 45 S=0 70->45 80 80 S=0 60->80 R139753741849488 60->R139753741849488 L139753741849320 80->L139753741849320 R139753741849320 80->R139753741849320 84 84 S=0 45->84 42 42 S=0 45->42 L139753741851448 84->L139753741851448 R139753741851448 84->R139753741851448 L139753741851504 42->L139753741851504 R139753741851504 42->R139753741851504 73 73 S=0 48->73 R139753741851560 48->R139753741851560 87 87 S=3 73->87 61 61 S=5 73->61 L139753741849208 87->L139753741849208 R139753741849208 87->R139753741849208 47 47 S=0 61->47 74 74 S=0 61->74 L139753741850608 47->L139753741850608 R139753741850608 47->R139753741850608 L139753741851616 74->L139753741851616 R139753741851616 74->R139753741851616
Out[25]:
False
In [26]:
big = makeHeap(big_seq)
fill_depth(big)
Out[26]:
Tree 6 6 S=0 29 29 S=1 6->29 48 48 S=1 6->48 70 70 S=2 29->70 R139753742150456 29->R139753742150456 60 60 S=3 70->60 45 45 S=3 70->45 80 80 S=4 60->80 R139753741375080 60->R139753741375080 L139753741374352 80->L139753741374352 R139753741374352 80->R139753741374352 84 84 S=4 45->84 42 42 S=4 45->42 L139753741374464 84->L139753741374464 R139753741374464 84->R139753741374464 L139753741374744 42->L139753741374744 R139753741374744 42->R139753741374744 73 73 S=2 48->73 R139753741374576 48->R139753741374576 87 87 S=3 73->87 61 61 S=3 73->61 L139753741374688 87->L139753741374688 R139753741374688 87->R139753741374688 47 47 S=4 61->47 74 74 S=4 61->74 L139753741374632 47->L139753741374632 R139753741374632 47->R139753741374632 L139753741373736 74->L139753741373736 R139753741373736 74->R139753741373736
In [27]:
def has_even_n(node, value):
    if node is None:
        return True
    l = has_even_n(node.left, value)
    r = has_even_n(node.right, value)
    childern_even = l == r # sude + sude = sude, liche + liche = sude
    if node.S == value:
        node.b = not childern_even
    else:
        node.b = childern_even
    return node.b

def has_even(tree, value):
    ret = has_even_n(tree.root, value)
    display(tree)
    return ret
In [28]:
big = makeHeap(big_seq)
fill_depth(big)
has_even(big, 4)
Tree 6 6 S=0 29 29 S=1 6->29 48 48 S=1 6->48 70 70 S=2 29->70 R139753742147768 29->R139753742147768 60 60 S=3 70->60 45 45 S=3 70->45 80 80 S=4 60->80 R139753741373792 60->R139753741373792 L139753741373904 80->L139753741373904 R139753741373904 80->R139753741373904 84 84 S=4 45->84 42 42 S=4 45->42 L139753741374520 84->L139753741374520 R139753741374520 84->R139753741374520 L139753741373680 42->L139753741373680 R139753741373680 42->R139753741373680 73 73 S=2 48->73 R139753741374296 48->R139753741374296 87 87 S=3 73->87 61 61 S=3 73->61 L139753741373568 87->L139753741373568 R139753741373568 87->R139753741373568 47 47 S=4 61->47 74 74 S=4 61->74 L139753741374184 47->L139753741374184 R139753741374184 47->R139753741374184 L139753741374800 74->L139753741374800 R139753741374800 74->R139753741374800
Out[28]:
False
In [29]:
big = makeHeap(big_seq)
big
Out[29]:
Tree 6 6 29 29 6->29 48 48 6->48 70 70 29->70 R139753741374240 29->R139753741374240 60 60 70->60 45 45 70->45 80 80 60->80 R139753741373848 60->R139753741373848 L139753741375472 80->L139753741375472 R139753741375472 80->R139753741375472 84 84 45->84 42 42 45->42 L139753741375808 84->L139753741375808 R139753741375808 84->R139753741375808 L139753741375864 42->L139753741375864 R139753741375864 42->R139753741375864 73 73 48->73 R139753741375920 48->R139753741375920 87 87 73->87 61 61 73->61 L139753741376032 87->L139753741376032 R139753741376032 87->R139753741376032 47 47 61->47 74 74 61->74 L139753741376088 47->L139753741376088 R139753741376088 47->R139753741376088 L139753741376144 74->L139753741376144 R139753741376144 74->R139753741376144

Inorder

Výsledkem je strom, jehož klíče jsou očíslovány od 1 do $|V|$ v pořadím, jakým prochází inorder průchod. V node.S je uložena hodnota, kterou prve vrací rodiči. Její význam je číslo o jedna větší než poslední, které jsem použil ve svém podstromě. Podstrom každého uzlu je očíslován čísly od vstupní hodnoty value do návratové hodnoty daného rekurzivního volání.

In [30]:
def fix_keys_n(node, value):
    if node is None:
        return value
    l = fix_keys_n(node.left, value)
    node.key = l
    r = fix_keys_n(node.right, l + 1)
    node.S = r
    return node.S

def fix_keys(tree):
    fix_keys_n(tree.root, 1)
    return tree
In [31]:
fix_keys(makeHeap(big_seq))
Out[31]:
Tree 8 8 S=15 7 7 S=8 8->7 14 14 S=15 8->14 3 3 S=7 7->3 R139753741796240 7->R139753741796240 2 2 S=3 3->2 5 5 S=7 3->5 1 1 S=2 2->1 R139753741795848 2->R139753741795848 L139753741798200 1->L139753741798200 R139753741798200 1->R139753741798200 4 4 S=5 5->4 6 6 S=7 5->6 L139753741739120 4->L139753741739120 R139753741739120 4->R139753741739120 L139753741739008 6->L139753741739008 R139753741739008 6->R139753741739008 10 10 S=14 14->10 R139753741740968 14->R139753741740968 9 9 S=10 10->9 12 12 S=14 10->12 L139753741741136 9->L139753741741136 R139753741741136 9->R139753741741136 11 11 S=12 12->11 13 13 S=14 12->13 L139753741849096 11->L139753741849096 R139753741849096 11->R139753741849096 L139753741851504 13->L139753741851504 R139753741851504 13->R139753741851504

Kopírujeme uzly (a převracíme pořadí)

In [32]:
def reverse_n(node):
    if node is None:
        return None
    new = Node()
    new.key = node.key
    new.left = reverse_n(node.right)
    new.right = reverse_n(node.left)
    return new

def reverse(tree):
    new_tree = Tree()
    new_tree.root = reverse_n(tree.root)
    return new_tree
In [33]:
display(big, reverse(big))
Tree 6 6 29 29 6->29 48 48 6->48 70 70 29->70 R139753741374240 29->R139753741374240 60 60 70->60 45 45 70->45 80 80 60->80 R139753741373848 60->R139753741373848 L139753741375472 80->L139753741375472 R139753741375472 80->R139753741375472 84 84 45->84 42 42 45->42 L139753741375808 84->L139753741375808 R139753741375808 84->R139753741375808 L139753741375864 42->L139753741375864 R139753741375864 42->R139753741375864 73 73 48->73 R139753741375920 48->R139753741375920 87 87 73->87 61 61 73->61 L139753741376032 87->L139753741376032 R139753741376032 87->R139753741376032 47 47 61->47 74 74 61->74 L139753741376088 47->L139753741376088 R139753741376088 47->R139753741376088 L139753741376144 74->L139753741376144 R139753741376144 74->R139753741376144
Tree 6 6 48 48 6->48 29 29 6->29 L139753741871200 48->L139753741871200 73 73 48->73 61 61 73->61 87 87 73->87 74 74 61->74 47 47 61->47 L139753741869128 74->L139753741869128 R139753741869128 74->R139753741869128 L139753741871144 47->L139753741871144 R139753741871144 47->R139753741871144 L139753741870864 87->L139753741870864 R139753741870864 87->R139753741870864 L139753741871760 29->L139753741871760 70 70 29->70 45 45 70->45 60 60 70->60 42 42 45->42 84 84 45->84 L139753741870248 42->L139753741870248 R139753741870248 42->R139753741870248 L139753741872432 84->L139753741872432 R139753741872432 84->R139753741872432 L139753741869408 60->L139753741869408 80 80 60->80 L139753741870528 80->L139753741870528 R139753741870528 80->R139753741870528

Hledání prvků ve stromech

Všechny kořeny podstromů, které obsahují nějaký uzel s node.S == value jsou zelené. Funkce vrací True pro stromy, který nějaký takový prvek obsahují. Projde vždy všechny uzly.

In [34]:
def find_all_n(node, value):
    if node is None:
        return False
    here = node.S == value
    l = find_all_n(node.left, value)
    r = find_all_n(node.right, value)
    node.b = here or l or r
    return node.b

def find_all(tree, value):
    ret = find_all_n(tree.root, value)
    display(tree)
    return ret 
In [35]:
find_all(fill_depth(big), 2)
Tree 6 6 S=0 29 29 S=1 6->29 48 48 S=1 6->48 70 70 S=2 29->70 R139753741374240 29->R139753741374240 60 60 S=3 70->60 45 45 S=3 70->45 80 80 S=4 60->80 R139753741373848 60->R139753741373848 L139753741375472 80->L139753741375472 R139753741375472 80->R139753741375472 84 84 S=4 45->84 42 42 S=4 45->42 L139753741375808 84->L139753741375808 R139753741375808 84->R139753741375808 L139753741375864 42->L139753741375864 R139753741375864 42->R139753741375864 73 73 S=2 48->73 R139753741375920 48->R139753741375920 87 87 S=3 73->87 61 61 S=3 73->61 L139753741376032 87->L139753741376032 R139753741376032 87->R139753741376032 47 47 S=4 61->47 74 74 S=4 61->74 L139753741376088 47->L139753741376088 R139753741376088 47->R139753741376088 L139753741376144 74->L139753741376144 R139753741376144 74->R139753741376144
Out[35]:
True

Hledá první uzel se zadaným klíčem. Vrací ukazatel na něj. Červeně jsou uzly, které algoritmus neúspěšně prošel, zelený je nalezený uzel a konečně modré jsou uzly, kam se výpočet vůbec nedostal. Všechny uzly projde jen v případě, že se hledaný klíč ve stromě neneachází.

Po nalezení prvku je potřeba tuto informaci propagovat zpět nahoru.

In [36]:
def find_first_n(node, value):
    if node is None:
        return None
    if node.key == value:
        node.b = True
        return node
    node.b = False
    l = find_first_n(node.left, value)
    if l is not None:
        return l
    r = find_first_n(node.right, value)
    return r

def find_first(tree, value):
    ret = find_first_n(tree.root, value)
    display(tree)
    return ret
In [37]:
find_first(makeHeap(big_seq), big_seq[8])
Tree 6 6 29 29 6->29 48 48 6->48 70 70 29->70 R139753741851672 29->R139753741851672 60 60 70->60 45 45 70->45 80 80 60->80 R139753741850832 60->R139753741850832 L139753741852288 80->L139753741852288 R139753741852288 80->R139753741852288 84 84 45->84 42 42 45->42 L139753741798536 84->L139753741798536 R139753741798536 84->R139753741798536 L139753741797920 42->L139753741797920 R139753741797920 42->R139753741797920 73 73 48->73 R139753741796688 48->R139753741796688 87 87 73->87 61 61 73->61 L139753741795456 87->L139753741795456 R139753741795456 87->R139753741795456 47 47 61->47 74 74 61->74 L139753741796352 47->L139753741796352 R139753741796352 47->R139753741796352 L139753741797416 74->L139753741797416 R139753741797416 74->R139753741797416
Out[37]:
<tree.Node at 0x7f1af422c898>
In [38]:
find_first(makeHeap(big_seq), 26)
Tree 6 6 29 29 6->29 48 48 6->48 70 70 29->70 R139753741796688 29->R139753741796688 60 60 70->60 45 45 70->45 80 80 60->80 R139753741798368 60->R139753741798368 L139753741795456 80->L139753741795456 R139753741795456 80->R139753741795456 84 84 45->84 42 42 45->42 L139753741796352 84->L139753741796352 R139753741796352 84->R139753741796352 L139753741797416 42->L139753741797416 R139753741797416 42->R139753741797416 73 73 48->73 R139753741797304 48->R139753741797304 87 87 73->87 61 61 73->61 L139753741798256 87->L139753741798256 R139753741798256 87->R139753741798256 47 47 61->47 74 74 61->74 L139753741796744 47->L139753741796744 R139753741796744 47->R139753741796744 L139753741797864 74->L139753741797864 R139753741797864 74->R139753741797864