2015-04-22 2 views
3

Поэтому, учитывая следующее:Использование генераторов для выполнения обхода дерева заказовМои на BST

def inorder(t): 
    if t: 
     inorder(t.left) 
     yield t.key 
     inorder(t.right) 

x = [ n for n in inorder(r) ] 

x содержит только корневой узел, почему?

Вот полный код; обратите внимание, что реализация BST верна, это реализация inorder() с генераторами, которая как-то не так.

class STree(object): 
    def __init__(self, value): 
     self.key = value 
     self.left = None 
     self.right = None 

def insert(r, node): 
    if node.key < r.key: 
     if r.left is None: 
      r.left = node 
     else: 
      insert(r.left, node) 
    else: 
     if r.right is None: 
      r.right = node 
     else: 
      insert(r.right, node) 

def inorder(t): 
    if t: 
     inorder(t.left) 
     yield t.key 
     inorder(t.right) 


r = STree(10) 
insert(r, STree(12)) 
insert(r, STree(5)) 
insert(r, STree(99)) 
insert(r, STree(1)) 

tree = [ n for n in inorder(r) ] 
print tree 
+0

Вы используете питон 2 или 3 ? – tzaman

+0

См. Третий ответ [здесь] (http://stackoverflow.com/questions/21175923/inorder-traversal-in-python). Вы только на самом деле приносите одно значение. Если вы используете python 3.3, вы можете использовать 'yield from'. –

ответ

7

inorder(t.left)inorder(t.left) только создает объект-генератор, он фактически не запускает его. Вам нужно перебирать и дают значения, полученное каждым из subgenerators:

# Python 2 
def inorder(t): 
    if t: 
     for key in inorder(t.left): 
      yield key 
     yield t.key 
     for key in inorder(t.right): 
      yield key 

Это становится намного чище с введением new syntax в Python 3.3+:

# Python 3 
def inorder(t): 
    if t: 
     yield from inorder(t.left) 
     yield t.key 
     yield from inorder(t.right) 
+0

Я зафиксировал ошибку на примере py2; в любом случае спасибо за объяснение, теперь это имеет гораздо больше смысла. – laurids

+0

@laurids видел это, приятный catch! и yw! – tzaman

+0

@tzaman получает недопустимый синтаксис. – Prerit

Смежные вопросы