2016-04-03 11 views
1

Bir ağacı bir dizeye dönüştürmek ve prestr sırasını almak istiyorum (kök ile başlar ve tüm sol düğümleri ve ardından sağdakilere geri gider) Örnek: ağaç (kök (sol (a) (b)) (sağ (c) (d))) "kök sol ab sağ cd" olacaktır. Bir ağaçtan sırayla dize yazdırmaya çalışırken sorun

class TreeNode: 
def __init__(self, data = None): 
    self.data = data 
    self.children = [] 

class Tree: 
def __init__(self, string = None): 
    self.root = None 

def prestr(self): 
    string1 = "" 
    value = self.root 
    string1 += value.data 
    string1 += " " 
    while len(value.children) > 0: 
     for i in value.children: 
      string1 += i.data 
      string1 += " " 
      value = i 
    print(string1) 

Bu

tree (root (left (a) (b)) (right (c) (d))) 

ile bu kodu çalıştırırken alıyorum: "root left right c d". Bunun, değer olarak ayarlandığında 'u value.children[0]'da çalıştırmayacağından şüpheleniyorum ama nedenini bilmiyorum. Burada sorun nedir?

cevap

0

Kodunuzdaki sorun, döngü için value = i'u ayarlamanızdır. Bunu yaptığınızda, kodunuzun while ...:'a dönmesini beklersiniz, ancak , değil, bunun yerine for döngüsünün sonraki yinelemesine gider. Bunun sonucu, bu değer üzerinde gerçekte devam etmeden önce düğümünün son çocuğunun son döngüsüne değer ayarlamanızdır. Bu, her bir düğümün sonuncu çocuğunun tümünü hariç tutuyor, bu yüzden sahip olduğunuz davranışları görüyordunuz. durumda yaklaşık ikna etmeye çok daha kolaydır olarak doğru olurken orijinal çözüme yakın tutmak için, ben onun yerine bu kodu için özyineleme kullanarak öneririm: Ancak

def prestr_helper(value): 
    if len(value.children) > 0: 
     return value.data + ' ' + \ 
      ' '.join(prestr_helper(child) for child in value.children) 
    else: 
     return value.data 

def prestr(self): 
    print(prestr_helper(self.root)) 

Bu sorunu var Python'un özyineleme sınırının ve dolayısıyla 1000 veya daha fazla derinlikte (yaklaşık olarak) ağaçlarda başarısız olunur. Bu kısıtlamayı aşmak için, here açıklandığı gibi yinelemeli bir çözüm uygulamak zorunda kalacaksınız.