C BST迭代前序遍历中的无限循环
我试图以预先排序的方式迭代遍历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
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。循环不再是无限的,而是只运行一次。有什么想法吗?为了遍历树,必须将节点推到堆栈上。不要试图通过将数据推到堆栈上来解决此问题。预排序遍历意味着您在当前节点打印数据,然后递归下降到子节点。你是如何递归地下降到孩子们身边的?将它们推到堆栈上。在循环的下一次迭代中,将从堆栈中弹出一个节点。它必须是一个节点。这些数据对你没有帮助。如果堆栈上没有节点,则不知道自己在树中的位置。我是否满意地回答了这个问题?