2016-11-15 2 views
1
def str_tree(atree,indent_char ='.',indent_delta=2): 
    def str_tree_1(indent,atree): 
     if atree == None: 
      return '' 
     else: 
      answer = '' 
      answer += str_tree_1(indent+indent_delta,atree.right) 
      answer += indent*indent_char+str(atree.value)+'\n' 
      answer += str_tree_1(indent+indent_delta,atree.left) 
      return answer 
    return str_tree_1(0,atree) 

def build_balanced_bst(l): 
    d = [] 
    if len(l) == 0: 
     return None 

    else: 
     mid = (len(l)-1)//2 
     if mid >= 1: 
      d.append(build_balanced_bst(l[:mid])) 
      d.append(build_balanced_bst(l[mid:])) 
     else: 
      return d 

build_balanced_bst (l) принимает список уникальных значений, которые сортируются в порядке возрастания. Он возвращает ссылку на корень хорошо сбалансированного двоичного дерева поиска. Например, вызов build_ballanced_bst (список (IRange (1,10)) возвращает двоичное дерево поиска высоты 3, будет печатать как:Печать двоичного дерева в определенном формате

......10 
....9 
..8 
......7 
....6 
5 
......4 
....3 
..2 
....1 

Функции str_tree гравюры, что функция возвращает build_balanced_bst

Я нахожусь работающих на build_balanced_bst (л) функции, чтобы сделать его применить к функции str_tree я использовал среднее значение в списке в качестве значения суперпользователя Но когда я вызываю функцию как способ ниже:..

l = list(irange(1,10)) 
t = build_balanced_bst(l) 
print('Tree is\n',str_tree(t),sep='') 

его не печатает что-нибудь. Может ли кто-нибудь помочь мне исправить мою функцию build_balanced_bst (l)?

ответ

1

Сохранение метода str_tree как есть, вот и следующий код.

class Node: 
    """Represents a single node in the tree""" 
    def __init__(self, value, left=None, right=None): 
     self.value = value 
     self.left = left 
     self.right = right 


def build_balanced_bst(lt): 
    """ 
    Find the middle element in the sorted list 
    and make it root. 
    Do same for left half and right half recursively. 
    """ 

    if len(lt) == 1: 
     return Node(lt[0]) 
    if len(lt) == 0: 
     return None 

    mid = (len(lt)-1)//2 
    left = build_balanced_bst(lt[:mid]) 
    right = build_balanced_bst(lt[mid+1:]) 
    root = Node(lt[mid], left, right) 
    return root 


ordered_list = list(range(1,11)) 
bst=build_balanced_bst(ordered_list) 
bst_repr = str_tree(bst) 
print(bst_repr) 

Выход выходит следующим образом:

......10 
....9 
..8 
......7 
....6 
5 
......4 
....3 
..2 
....1 
Смежные вопросы