二叉树层次遍历的问题

想问一下这段代码的错误,要怎么修改呢?这是二叉树的层次遍历。
树的结构定义为

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

层次遍历

#define Max 100
void LevelorderTraversal( BinTree BT ){
    int Q[Max];
    int f,r;
    f=r=0;
    Q[r++]=BT;
    BinTree T=NULL;
    while(f<r){
        T=Q[f++];
        printf("%d",T->Data);
        if(BT->Left){
            Q[r++]=T->Left;
        }
        if(BT->Right){
            Q[r++]=T->Right;
        }
    }
}

修改如下,改动处见注释,供参考:

typedef int ElementType;

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

#define Max 100
void LevelorderTraversal(BinTree BT){
    BinTree Q[Max]; //int Q[Max];  修改
    int f,r;
    f=r=0;
    if (!BT)  return;//二叉树为空  修改
    BinTree T = BT;  //修改
    Q[r++] = T;
    while(f < r){
        T=Q[f++];
        printf("%d ",T->Data);
        if(BT->Left){
            Q[r++]=T->Left;
        }
        if(BT->Right){
            Q[r++]=T->Right;
        }
    }
}


按照你的遍历代码来看,你每次只是遍历了根节点及其子节点,这样就不能遍历整个二叉树,所以需要在遍历时,将判断条件改为你正在遍历的T节点即可,如下:

……
        if(T->Left){
            Q[r++]=T->Left;
        }
        if(T->Right){
            Q[r++]=T->Right;
        }

……

希望能帮到你,加油~~~

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/260273
  • 这篇博客也不错, 你可以看下编写一个程序,要求输入两个浮点数,然后打印出用二者的差值除以二者的乘积所得的结果。在用户键入非数字的输入之前程序循环处理每对输入值。
  • 除此之外, 这篇博客: 研究树为什么要重点研究二叉树?一次性搞懂二叉树和树的初阶知识中的 🥫4.层次遍历 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •   从上到下,从左到右依次遍历。

    在这里插入图片描述

  • 您还可以看一下 魏老师老师的从零搭建英伟达平台远程开发调试环境课程中的 远程启动需要图形解码的应用程序以及开机启动部署小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    二叉树的定义: 二叉树是树的一种简单而重要的特殊情况,即树中任何节点都不能有多于两个的子节点,称为"左子树"和"右子树"。

    实现代码:

    typedef struct node{
        int data;
        struct node* lchild;
        struct node* rchild;
    }Node;
    
    Node* createNode(int data){
        Node* node = (Node*)malloc(sizeof(Node));
        node->data = data;
        node->lchild = NULL;
        node->rchild = NULL;
        return node;
    }
    
    void inOrderTraversal(Node* root){
        if(root){
            inOrderTraversal(root->lchild);
            printf("%d ", root->data);
            inOrderTraversal(root->rchild);
        }
    }
    
    void preOrderTraversal(Node* root){
        if(root){
            printf("%d ", root->data);
            preOrderTraversal(root->lchild);
            preOrderTraversal(root->rchild);
        }
    }
    
    void postOrderTraversal(Node* root){
        if(root){
            postOrderTraversal(root->lchild);
            postOrderTraversal(root->rchild);
            printf("%d ", root->data);
        }
    }
    
    void levelOrderTraversal(Node* root){
        Node* queue[MAX_SIZE];
        int front = -1, rear = -1;
        if(root != NULL){
            queue[++rear] = root;
        }
        while(front != rear){
            front = (front + 1) % MAX_SIZE;
            Node* node = queue[front];
            printf("%d ", node->data);
            if(node->lchild != NULL){
                queue[++rear] = node->lchild;
            }
            if(node->rchild != NULL){
                queue[++rear] = node->rchild;
            }
        }
    }
    

    以上是二叉树的基本代码实现,包括创建结点,遍历二叉树的4个函数,分别为: 中序遍历(左根右)、前序遍历(根左右)、后序遍历(左右根)和层次遍历(自上而下、自左至右)。 其中遍历使用到的是递归方法和队列,层次遍历采用的是循环和队列的结构实现。可以根据题目需求进行选择使用什么方法。