2014-12-06 94 views
0

我試圖在預先迭代地遍歷一個BST,但是這個函數在打印時陷入了無限循環。有人能告訴我爲什麼會發生這種情況嗎?無限循環在BST迭代序列遍歷中

1 typedef struct node_{ 
2  int data; 
3  struct node_* left; 
4  struct node_* right; 
5 }BST; 

22 void preorder(BST* tree){ 
23  if(tree==NULL){ 
24   return; 
25  } 
26  // create stack 
27  stack* stack=create_stack(); 
28  // push data onto stack 
29  push(stack,tree->data); 
30  while(isEmpty(stack)==0){ 
31   struct node_ *node; 
32   node->data=top(stack); 
33   printf("%d ",node->data); 
34   // pop value off stack 
35   pop(stack); 
36   if(node->right!=NULL){ 
37    //push right child onto stack 
38    push(stack,node->right->data); 
39   } 
40   if(node->left!=NULL){ 
41    // push left child onto stack 
42    push(stack,node->left->data); 
43   } 
44  } 
45 } 
+0

我對這個問題回答滿意嗎? – 2015-04-24 06:50:00

回答

1

你的循環永遠不會結束,因爲node->rightnode->left點隨機存儲器位置。 node的價值是多少?你還沒有分配任何東西。它的值是隨機的。

另一個問題是您要將tree->data推入堆棧。你實際上想把tree推到堆棧上。然後,您可以從堆棧中彈出一個節點,並將其分配給node。現在您可以打印node->data並檢查node的孩子。

+0

好吧,我爲BST的大小準備了空間,因爲那個結構被重命名爲。我的推功能期望一個整數,這就是爲什麼我有樹 - >數據。循環不再是無限的,而是隻運行一次。有任何想法嗎? – 2014-12-06 00:55:38

+0

爲了遍歷樹,必須將節點推入堆棧。不要試圖通過將數據推入堆棧來解決此問題。預定義遍歷意味着您在當前節點打印數據,然後遞歸下降到子節點。你如何遞歸下降到孩子?將它們推入堆棧。在循環的下一次迭代中,您從堆棧中彈出一個節點。它必須是一個節點。數據不會幫助你。如果堆棧中沒有節點,則不知道樹中的位置。 – 2014-12-06 01:03:50