weixin_43894905 2024-04-23 00:20 采纳率: 20%
浏览 1

为什么使用这个函数打印二叉树只打印出abdh

二叉树是abcdefghij,为什么这个函数不加if root不等于null,就只能打印出abdh,而加了if不等于null就能打印出全部二叉树

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-23 00:20
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的代码片段中,缺少了一些关键部分,比如二叉树节点结构的定义以及创建二叉树的具体代码。不过,我可以根据您的描述推测可能的问题所在,并提供一个通用的解决方案。

    首先,让我们假设您的二叉树节点结构类似下面这样:

    struct bitree {
        char data;
        struct bitree *left, *right;
    };
    

    接下来,为了创建一个完整的二叉树,我们需要定义一个函数来构建它。这里我将展示如何创建一个简单的二叉树,其中包含字符'a'到'j':

    bitree* createTree() {
        bitree* root = new bitree();
        root->data = 'a';
        
        root->left = new bitree();
        root->left->data = 'b';
        root->left->left = new bitree();
        root->left->left->data = 'c';
        root->left->right = new bitree();
        root->left->right->data = 'd';
    
        root->right = new bitree();
        root->right->data = 'e';
        root->right->left = new bitree();
        root->right->left->data = 'f';
        root->right->right = new bitree();
        root->right->right->left = new bitree();
        root->right->right->left->data = 'g';
        root->right->right->right = new bitree();
        root->right->right->right->data = 'h';
        root->right->right->right->left = new bitree();
        root->right->right->right->left->data = 'i';
        root->right->right->right->right = new bitree();
        root->right->right->right->right->data = 'j';
    
        return root;
    }
    

    然后我们可以调用createTree()函数并将其结果传递给print函数进行遍历:

    int main() {
        bitree* root = createTree();
        print(root);
        return 0;
    }
    

    关于您的问题,当您在print函数开始时添加if (root != NULL)检查,这确保了只有非空节点才会被处理。这是正确的做法,因为如果不这样做,程序可能会尝试访问未初始化的指针,导致未定义的行为。所以,如果您没有添加这个检查,程序可能会只打印一部分节点,甚至崩溃。

    以下是完整的代码示例:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct bitree {
        char data;
        struct bitree *left, *right;
    };
    
    struct queue {
        bitree* item;
        struct queue* next;
    };
    
    void enqueue(struct queue** front, struct queue** rear, bitree* node) {
        struct queue* temp = (struct queue*)malloc(sizeof(struct queue));
        temp->item = node;
        temp->next = NULL;
    
        if(*rear == NULL) {
            *front = temp;
            *rear = temp;
        } else {
            (*rear)->next = temp;
            *rear = temp;
        }
    }
    
    void dequeue(struct queue** front, struct queue** rear) {
        if(*front == NULL) return;
    
        struct queue* temp = *front;
        *front = (*front)->next;
    
        free(temp);
    }
    
    void print(bitree* root) {
        if(root == NULL) return;
    
        struct queue* front = NULL;
        struct queue* rear = NULL;
    
        enqueue(&front, &rear, root);
    
        while(front != NULL) {
            bitree* current = front->item;
            printf("%c ", current->data);
            dequeue(&front, &rear);
    
            if(current->left != NULL)
                enqueue(&front, &rear, current->left);
            if(current->right != NULL)
                enqueue(&front, &rear, current->right);
        }
    }
    
    bitree* createTree() {
        // ... 创建二叉树的代码 ...
    }
    
    int main() {
        bitree* root = createTree();
        print(root);
        return 0;
    }
    

    这段代码应该可以正确地打印出整个二叉树(从根节点到叶子节点)。如果您仍然遇到问题,请确认是否已正确实现createTree函数,以创建包含所有字符'a'到'j'的二叉树。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月23日

悬赏问题

  • ¥15 Java与Hbase相关问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开
  • ¥45 工程软件单片机设计课题要求
  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)