提问人:bFur4list 提问时间:5/25/2023 更新时间:5/25/2023 访问量:41
带循环队列的遍历二叉搜索树
Traversal Binary search tree with circular-queue
问:
#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 15
typedef struct _Node {
int data;
struct _Node* left;
struct _Node* right;
} Node;
typedef struct {
int data[MAX_QUEUE_SIZE];
int front, rear;
}queue;
void init_q(queue* q)
{
q->front = 0;
q->rear = 0;
}
int is_empty(queue* q)
{
return (q->front == q->rear);
}
int is_full(queue* q)
{
return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front);
}
void enqueue(queue* q, int data)
{
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
q->data[q->rear] = data;
}
int dequeue(queue* q)
{
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return q->data[q->front];
}
Node* insertBST(Node* root, int data) {
Node* p = root;
Node* parent = NULL;
while (p != NULL) {
parent = p;
if (p->data < data) {
p = p->right;
}
else {
p = p->left;
}
}
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode != NULL)
{
newNode->data = data;
}
newNode->left = newNode->right = NULL;
if (parent != NULL) {
if (parent->data < newNode->data) {
parent->right = newNode;
}
else {
parent->left = newNode;
}
}
return newNode;
};
void Inorder(Node* root, queue* q) {
if (root == NULL) {
return;
}
else
{
Inorder(root->left, q);
enqueue(q, root->data);
//printf("%d", root->data);
Inorder(root->right, q);
}
printf("Inorder Traversal : ");
while (!is_empty(q))
{
printf("%d ", dequeue(q));
}
printf("\n");
}
int main()
{
queue* q;
init_q(&q);
Node* root = NULL;
root = insertBST(NULL, 6);
insertBST(root, 2);
insertBST(root, 7);
insertBST(root, 1);
insertBST(root, 4);
insertBST(root, 3);
insertBST(root, 5);
Inorder(root, &q);
return 0;
}
二叉搜索树的结构 我做了什么:
6
2 7
1 4
3 5
所以我期望的结果是:Inorder Traversal : 1 2 3 4 5 6 7
但结果似乎被打破了,如下所示:Inorder Traversal : -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -24257920 390 -858993460 -858993460 -858993460 -858993460 -858993460 1 Inorder Traversal : -858993460 -858993460 -858993460 -858993460 -858993460 -24257920 390 -858993460 -858993460 -858993460 -858993460 -858993460 3 Inorder Traversal : -858993460 -858993460 -858993460 -858993460 -858993460 -24257920 390 -858993460 -858993460 -858993460 -858993460 -858993460 5 Inorder Traversal : Inorder Traversal : Inorder Traversal : -858993460 -858993460 -858993460 -858993460 -858993460 -24257920 390 -858993460 -858993460 -858993460 -858993460 -858993460 7 Inorder Traversal :
看来我在函数上犯了一个错误(我猜递归效果不好)inorder
我猜是指针问题。
我错了什么,我应该如何修改我的代码? (修改此代码后,我将尝试实现 postorder 和 preorder。
感谢您的帮助。
答:
存在以下问题:
in 的声明应代替 。期望作为第二个参数 a 而不是 .大多数 IDE 都会对这个错误发出警告。
q
main
queue q
queue *q
insertBST
queue*
queue**
的实现正在移动错误的索引。它应该移动而不是 .
enqueue
rear
front
这不是一个大问题,但是:
您似乎想在呼叫后打印队列,而不是在呼叫期间。我建议创建一个单独的函数来打印队列。
Inorder
打电话时不要投射。执行以下操作
malloc
Node* newNode = malloc(sizeof(*newNode)); // Don't cast
当失败时,您的代码会保护对 的赋值,但随后让我们继续执行设置 ,...等。相反,您可以退出:
malloc
root->data
root->left
if (newNode == NULL) exit(1); // When malloc fails
评论