2016-03-21 17 views
-1

için ağaç düğümlerini temini için bir C++ ön sipariş yineleyici oluşturun:Bir C bu döngüye ağaç düğümlerini tedarik ++ programı yazmaya çalışıyorum bir döngü

bin_tree<int> *my_tree = ... 
for (bin_tree<int>::iterator n = my_tree->begin(); 
    n != my_tree->end(); ++n) 
{ 
    cout << *n << "\n"; 
} 

Java ile yazılmış olan sınıf ve isterim C++ 'ya çevirmeyi sever, ancak bunu yaparken sorun yaşıyorum. Bu sınıftır:

class BinTree<T> implements Iterable<T> { 
BinTree<T> left; 
BinTree<T> right; 
T val; 
// other methods: insert, delete, lookup, ... 

public Iterator<T> iterator() 
{ 
    return new TreeIterator(this); 
} 
private class TreeIterator implements Iterator<T> 
{ 
    private Stack<BinTree<T>> s = new Stack<BinTree<T>>(); 
    TreeIterator(BinTree<T> n) 
    { 
     if (n.val != null) s.push(n); 
    } 
    public boolean hasNext() 
    { 
     return !s.empty(); 
    } 
    public T next() 
    { 
     if (!hasNext()) throw new NoSuchElementException(); 
     BinTree<T> n = s.pop(); 
     if (n.right != null) s.push(n.right); 
     if (n.left != null) s.push(n.left); 
     return n.val; 
    } 
    public void remove() 
    { 
     throw new UnsupportedOperationException(); 
    } 
} 
} 

C++ doğru bu programı yazma konusunda herhangi bir yardım mutluluk duyacağız, düzgün ön sipariş yineleyici nasıl uygulanacağı emin değilim. Eğer aşağıdaki öneririm yineleyicinızı destekleyen bir kapsayıcı oluşturmak çalışıyorsanız

cevap

0

(++ muhtemelen bütün bunları bilmek ama iyi C yazmanıza yardımcı olabilir):

sizin durumunuzda mantıklı olabilir (yineleyicinızı anlama çift ​​yönlü yineleyiciler olması). Yineleyiciler, C + + 'daki işaretçiler için sarmalayıcılardır.

İstediğiniz temel veri yapısını öğrenin (ikili ağaç veya ikili arama ağacı?).

Yineleyici ağaçtan nasıl geçmeli? (Ön sipariş, envanter, postorder veya seviye sırası)

Benim yaklaşımım kendi düğüm sınıfım/yapmamı yazmak olacaktır. Ardından, işaretçi manipülasyonunu işleyen bir yineleme sınıfı yazın. Tahsisleri işlemek için belirli bir şekilde gerekirse, yardımcı olmak için özel bir ayırıcı yazabilirim. Son olarak, diğer sınıfları kullanan kapsayıcınızı yazın. (Modüler ve C++ ile anlaşılması kolay şekilde işlevselliği ayırır)

Sadece yineleyici mantığını arıyorsanız ve ihtiyacınız olan her şeye sahipseniz; Başlamak ilk adres ve örneğin & veri [0] olarak sarılabilir. Son, benzer bir şekilde son adres. ++ operatörü işaretçiler üzerinde desteklenir ve sonuna doğru doğrusal olarak ilerler. Hala ağacın hareket etmesi gerektiğini anlamaya çalışmak isteyecek! Hatta çeşitli yollar sağlayabilir.

İyi şanslar!