Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C BST迭代前序遍历中的无限循环_C - Fatal编程技术网

C BST迭代前序遍历中的无限循环

C BST迭代前序遍历中的无限循环,c,C,我试图以预先排序的方式迭代遍历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

我试图以预先排序的方式迭代遍历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 }

循环永远不会结束,因为
node->right
node->left
指向随机内存位置。
节点的值是多少?你还没有给它分配任何东西。它的值是随机的


另一个问题是您正在将
树->数据
推到堆栈上。实际上,您需要将
推到堆栈上。然后可以从堆栈中弹出一个节点,并将其分配给
节点
。现在,您可以打印
node->data
,并检查
node

的子级,以确定BST的大小,因为该结构已重命名为。我的push函数需要一个整数,这就是为什么我有tree->data。循环不再是无限的,而是只运行一次。有什么想法吗?为了遍历树,必须将节点推到堆栈上。不要试图通过将数据推到堆栈上来解决此问题。预排序遍历意味着您在当前节点打印数据,然后递归下降到子节点。你是如何递归地下降到孩子们身边的?将它们推到堆栈上。在循环的下一次迭代中,将从堆栈中弹出一个节点。它必须是一个节点。这些数据对你没有帮助。如果堆栈上没有节点,则不知道自己在树中的位置。我是否满意地回答了这个问题?