2016-03-21 65 views
-1

我試圖寫一個C++程序提供節點,以這種循環:創建一個C++序迭代器提供樹節點的循環

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

類我是用Java編寫的,我會喜歡把它翻譯成C++,但是我很難這樣做。這是類:

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++中正確編寫這個程序的任何幫助,將不勝感激,我不知道如何正確地貫徹序迭代器。

回答

0

如果你想創建一個支持迭代器,我建議以下的容器(你可能知道這一切,但它可以幫助你寫出好的C++):

瞭解迭代器(在你的情況下,它可能是有意義的有雙向迭代器)。迭代器是C++中指針的包裝器。

瞭解您想要的基礎數據結構(二叉樹或二叉搜索樹?)。

迭代器應該如何遍歷樹? (預訂,inorde,後期訂單或級別訂單)

我的方法是編寫我自己的節點類/結構。然後編寫一個處理指針操作的迭代器類。如果你需要以某種方式處理分配,我會寫一個自定義分配器來幫助。最後編寫使用其他類的容器。 (模塊化並以易於在C++中理解的方式分離出功能)

如果您只是在尋找迭代器邏輯並擁有您需要的一切;開始是第一個地址,例如可以打包爲&數據[0]。 End是類似方式的最後一個地址。 ++運算符在指針上受支持,並且會朝着結尾線性移動。仍然會想弄清楚移動樹應該工作!甚至可以提供多種方式。

祝你好運!