2012-03-06 40 views
-1

可以在不使用指針或引用的情況下遍歷列表。 在某些情況下,這消除了實際擁有該列表的需要。 考慮下面的代碼,如何在不使用指針或引用的情況下迭代二叉樹?

int i; 
for (i = 0; i < 10; ++i) 
printf("%i ", i % 2); 

它直接輸出該列表0 1 0 1 0 1 0 1 0 1,而無需實際存儲在存儲器中的列表中。

怎麼能用二叉樹做類似的事情?

請在下面的代碼中顯示一個實現tree_iterator,new_root_tree_iterator和traverse_tree_iterator的方法,其中up​​per_boundary_of_tree類似於列表示例中的數字10,並且我不知道如何定義。

人們遇到了我所說的upper_boundary_of_tree的問題。樹的上邊界不會用數字10表示。我不知道如何表示樹的某個上邊界。這是問題的一部分。樹的上邊界類似於上面列表代碼中使用數字10的方式,因爲它在相同的函數中標記了停止迭代的位置,但這絕對不是一回事。

如果你需要,你也可以有一個free_tree_iterator函數。

tree_iterator i = new_root_tree_iterator(); 
while (traverse_tree_iterator(&i, upper_boundary_of_tree)) 
foobar(i); 

這一直困擾着我一段時間。

+0

你試過自​​己解決嗎?編寫一個使用指針或引用的樹型迭代器。 – Blender 2012-03-06 19:06:58

+0

將數字打印到文本流中的功能正在顯示一個序列,它不會創建一個列表。抽象序列與列表不同。 – Kaz 2012-03-06 19:07:51

+0

如果你想使用未存儲在內存中的列表,你需要懶列表。懶惰列表可能會生成無限數量的項目,並且可能會由使用該列表的某個函數進行處理,並且這些都會發生在常量內存中。 (因爲消費者在列表中前進,失去了對前端的引用,這是垃圾回收。)但這仍然涉及指針。 – Kaz 2012-03-06 19:10:35

回答

0

要打印樹結構的符號而不構建樹,類似於打印序列而不是構建列表的方式,首先必須確定符號的外觀。

你能寫下一個例子嗎?

例如,一個類似Lisp的符號?

((1 2)(3 4));;這是一棵樹

此外,給定10的上限,這意味着將有十個編號的葉節點,你應該打印哪些二叉樹?

直列表是一個簡併二叉樹,所以實際上你簡單的for循環基本上滿足了作業問題。

+0

我想要一個記號,我有一個索引和樹的元素列表。例如,[(i0,'a'),(i1,'b'),(i2,'c')],其中i0,i1和i2是我無法用正確的符號表達的東西。 – 2012-03-06 19:17:05

2

您無法遍歷不存在的數據。第一個例子中顯示的是一個循環,打印0或1次10次。遍歷數組(或任何其他數據結構)的想法是以某種方式處理每個元素,例如計算數組元素的總和。

換句話說,第一個例子是模擬迭代10個元素的數組,它們是零和一個,一個接一個。所以,在每次迭代中,您都會根據其索引預測值。

如果要計算二叉樹中子節點的索引,可以使用heap分配公式:2n + 1和2n + 2分別計算左右節點的索引,其中n爲0-基於指數。根據計算的指標,您可以模擬節點的值。

+0

感謝您給我一個樹形數據結構索引的良好表示,但是,如何表示列表的上限,以何時停止迭代? – 2012-03-06 19:55:58

+0

由於它是一棵二叉樹,所以2個n元素的權力 - 1會給你一個n級樹中元素的最大數目:2^n-1 – ahanin 2012-03-06 20:08:38

+0

不,這不是我的意思。我需要一個樹型的骨架。單元類型元素樹的一些表示。 – 2012-03-07 02:10:04