【发布时间】:2020-08-20 00:21:45
【问题描述】:
我正在尝试使用队列在二叉树中实现级别顺序遍历算法(队列是使用链表实现的)。它应该打印树中的所有节点,但是由于某种原因我无法弄清楚,输出只是根数据。如果您能帮助我,我将不胜感激!这是我的代码:`
#include <stdio.h>
#include <stdlib.h>
typedef struct BSTNode{
int data;
struct BSTNode* left;
struct BSTNode* right;
} bstNode;
/* Queue */
typedef struct queueNode{
bstNode* node;
struct queueNode* next;
} qNode;
typedef struct Queue
{
qNode* head;
qNode* end;
} queue;
bstNode* getNewNode(int data){
bstNode* newNode = (bstNode*)malloc(sizeof(bstNode));
if(!newNode)
return NULL;
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void insertBSTNode(bstNode** root, int data){
if(*root == NULL){ // empty tree
*root = getNewNode(data);}
else if((*root)->data >= data)
insertBSTNode(&((*root)->left), data);
else insertBSTNode(&((*root)->right), data);
}
queue* initQ(){
queue* q = (queue*)malloc(sizeof(queue));
if(!q) return NULL;
q->head = NULL;
q->end = NULL;
return q;
}
qNode* allocNewQNode(bstNode* root)
{
qNode* newNode = (qNode*)malloc(sizeof(qNode));
if (!newNode) return NULL;
newNode->node = (bstNode*)malloc(sizeof(bstNode));
if(!newNode->node){
free(newNode);
return NULL;
}
//memcpy(newNode->node, root, sizeof(bstNode));
newNode->node->data = root->data;
newNode->node->left = root->left;
newNode->node->right = root->right;
newNode->next = NULL;
return newNode;
}
void enqueue(queue* q, bstNode* root)
{
qNode* tmp = allocNewQNode(root);
if(q->head == NULL && q->end == NULL){
q->head = tmp;
q->end = tmp;
return;
}
else{
q->end->next = tmp;
q->end = tmp;
return;
}
}
qNode* dequeue(queue* q)
{
if(q->head == NULL) return NULL;
qNode* tmp = allocNewQNode(q->head->node);
qNode* aux = NULL;
q->head->node = NULL;
aux = q->head;
q->head = q->head->next;
free(aux);
return tmp;
}
void levelOrder(bstNode* root)
{
if(root == NULL) return;
else
{
queue* q = initQ();
enqueue(q, root);
while(q->head != NULL){
qNode* tmp = dequeue(q);
printf("%d ", tmp->node->data);
if (tmp->node->right != NULL){
enqueue(q, tmp->node->right);
}
if(tmp->node->left != NULL){
enqueue(q, tmp->node->left);
}
}
}
}
int main(){
bstNode* root = NULL;
insertBSTNode(&root, 2);
insertBSTNode(&root, 7);
insertBSTNode(&root, 5);
insertBSTNode(&root, 6);
insertBSTNode(&root, 9);
insertBSTNode(&root, 128);
insertBSTNode(&root, 223);
insertBSTNode(&root, 357);
levelOrder(root);
return 0;
}
`
【问题讨论】:
-
是时候开始学习调试器了。相信我,它会有所帮助。
-
levelOrder在我看来完全是假的。首先队列是空的。然后将一个元素入队,然后将一个元素出队(现在队列再次为空,q->head为 NULL),在下一次运行 while 循环时,后者停止,因为 while 语句中的q->head != NULL条件为假。 -
您存储在队列中的节点实际上应该只是对树中节点的引用。无需复制。
-
@MOehm 谢谢!我改变了它,现在它可以工作了
-
很高兴听到。 (您可能还必须在 `enqueue 中删除对
end == NULL的检查。)
标签: c struct binary-search-tree tree-traversal function-definition