2012-01-22 72 views
3

我創建了一個二叉樹結構來存儲一個有界的卷層次結構,使其更易於使用(並且更安全)我創建了兩個迭代器來補充它:寬度優先和深度優先。如何創建過去式迭代器?

廣度優先迭代器實質上是底層QList的包裝。但是我陷入了深度優先的迭代器(僅限於雙向),我可以處理樹周圍的實際迭代,我只是不知道如何創建一個過時的迭代器。

我不能僅僅使用​​,因爲不能保證最底層的最右邊的節點也是整個樹的最右邊的節點。我不願意做一個可以測試的'虛假'BVH節點,因爲它會涉及到大量的代碼更改(並且可能是開銷),讓各種節點管理機制忽略虛假節點,並且禁用很多樹型建築自動化(例如,假節點的父節點將不得不被告知它是葉子)。但如果這是唯一的方法 - 那麼這是唯一的方法。

+0

和代碼? 。 –

+0

我認爲這將是一個更結構性的問題。迭代器,樹形結構和BVH節點本身有數百行代碼。你想看什麼? – cmannett85

+2

如果添加假節點,請記住它實際上不需要以任何方式連接到樹,或者甚至實際存在(對於某些容器)。唯一的要求是你的迭代器必須能夠從它到最後一個,並從最後一個到這個,這可以在_iterator的代碼中完成。 (取決於你的結構。) –

回答

0

已經簡要地看過qlist.h,看起來你不能在兩種迭代類型中使用相同的end()。但沒關係 - 您可以使用空指針或靜態虛擬或其他技術爲第二個迭代方法創建end()迭代器。我不明白爲什麼這會影響大量的其他代碼(其中大部分代碼應該只是在不知道其實現細節的情況下引用end())。

+0

由於樹的(可能的)形狀,我不能使用'QList :: end()'迭代器。我認爲我必須修改節點的代碼才能正確地集成假節點,但是Mooing Duck是一些東西... – cmannett85

0

你不能只用null或類似的東西來結束嗎?這至少是我期望的,例如爲鏈表結構。

+0

不,因爲子鏈接中的NULL意味着它是葉節點。請記住,我正在談論一個樹結構 - 有很多'結束'。 – cmannett85