带循环队列的遍历二叉搜索树

Traversal Binary search tree with circular-queue

提问人:bFur4list 提问时间:5/25/2023 更新时间:5/25/2023 访问量:41

问:

#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。

感谢您的帮助。

C 递归 队列 binary-tree binary-search-tree

评论


答:

0赞 trincot 5/25/2023 #1

存在以下问题:

  • in 的声明应代替 。期望作为第二个参数 a 而不是 .大多数 IDE 都会对这个错误发出警告。qmainqueue qqueue *qinsertBSTqueue*queue**

  • 的实现正在移动错误的索引。它应该移动而不是 .enqueuerearfront

这不是一个大问题,但是:

  • 您似乎想在呼叫后打印队列,而不是呼叫期间。我建议创建一个单独的函数来打印队列。Inorder

  • 打电话时不要投射。执行以下操作malloc

    Node* newNode = malloc(sizeof(*newNode)); // Don't cast
    
  • 当失败时,您的代码会保护对 的赋值,但随后让我们继续执行设置 ,...等。相反,您可以退出:mallocroot->dataroot->left

    if (newNode == NULL) exit(1); // When malloc fails
    

评论

0赞 trincot 5/26/2023
对这个答案有什么反馈吗?