用c语言实现简单二叉树的输出,但输出出现很多问题。我已尝试了很多。

1代码目的:输出括号表示法的广义表 相应的二叉树。
2代码遇到的问题:没能输出二叉树,输出的切是个问号:
3想要的结果是:二叉树为:一个二叉树:
实际运行的结果是:二叉树为:?
4我的尝试与寻找:发现问号是执行输出二叉树函数里,然后为将百发c改为百发d,输出的是-51。这时我觉得是正常是输出A,没成功可能是T,p赋值初始化等出现了问题。由于起初程序运行出现了很多警告,我便增删一些代码,减少警告,不是完全按教材的c++来写,而是用c语言来写。推测bug是在输出二叉树函数里。
5

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 80
#define ElemType char
typedef struct node {//结构体类型定义
    ElemType data;
    struct node* lchild;//指针指向左孩子
    struct node* rchild;//指针指向右孩子
}BTNode;
int InitBiTree(BTNode* T) {//初始化二叉树
    T = NULL;
    return 1;
}
void CreateBiTree(BTNode* T, char str[]) {//str 可以用char str吗,BTNode*T和BTNode T的区别
    BTNode* St[MaxSize] = { NULL };
    BTNode* p = NULL;
    T =  NULL ;
    int top = -1, tag=0, j = 0;//top用于返回St[top]指针,tag判断左右孩子,j
    char ch;
    ch = str[j];
    while (ch != '\0') {
        switch (ch) {
        case '(':
            top++;
            if (top == (-1))
                return ;
            St[top]=p;//开始时将根节点(根)压入栈中;
            tag = 1;//接下来要开始接左孩子
            break;
        case ')':
            top--;//退栈,往回指向前驱结点,每退一次,回溯指向前驱结点
            break;
        case ',':
            tag = 2;//接下来要开始接右孩子    
            break;
        default:
            p = (BTNode*)malloc(sizeof(BTNode));//申请新结点,使得p指向它
            if (p == NULL)
                return ;
            p->data = ch;//存储数据
            p->lchild = p->rchild = NULL;//使新节点的左右指针域为空
            if (T == NULL) {
                T = p;
            }
            else {
                switch (tag) {
                case 1:
                    if (St[top] == NULL)
                        return ;
                    St[top]->lchild = p;//使得上一个双亲结点的左指针指向新结点
                    break;
                case 2:
                    if(top==-1)
                        return 0;
                    St[top]->rchild = p;//使得上一个双亲结点的右指针指向新结点
                    break;
                }
            }
        }
        j++;
        ch = str[j];
    }
    
}
void PrintBiTree(BTNode* T) {//输出二叉树
    if (T == NULL)
        return 0;
    if (T != NULL) {//刚开始判断二叉树是否为空,既访问第一个根节点,后来判断其他根节点
        printf("%c", T->data);//访问结点
    }
    if (T->lchild != NULL || T->rchild != NULL) {//判断根节点左右指针域是否空,是否有左右孩子
        printf("(");//开始接左孩子
        PrintBiTree(T->lchild);//
        if (T->rchild != NULL)
            printf(",");//开始接右孩子
        PrintBiTree(T->rchild);//
        printf(")");//回溯,退
    }
}


int main() {
    char str[] = "A(B(D, E(H(J, K(L, M(, N))), )), C(F, G(, I)))" ;
    BTNode* T= (BTNode*)malloc(sizeof(BTNode));
    InitBiTree(T);
    CreateBiTree(T, str);
    printf("二叉树为:\n");
    PrintBiTree(T);
    return 0;
    
    
}

58行 if (T = NULL)
改为
if (T == NULL)

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^