数据结构二叉树构建代码改正

不知道这个代码哪里错了,求改好的代码
题目:
按先序遍历的扩展序列建立二叉树的二叉链表存储结构,实现二叉树先序、中序、后序遍历的递归算法,实现二叉树层次遍历的非递归算法,求二叉树的结点个数和二叉树的深度。要求:在一个程序里完成。

img

img

img

img

img

img

img

引用chatgpt部分指引作答:
这段代码存在多处错误,以下是改正后的代码:

#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef char TElemType;
typedef int Status;
#define OK 1
#define ERROR 0

/* 二叉链表储存结构 */
typedef struct BiTNode {
    TElemType data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

/* 函数声明 */
Status CreateBiTree(BiTree &T);
Status PrintElement(TElemType e);
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType));
Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType));
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType));
int Depth(BiTree T);
void LevelOrderTraverse(BiTree b, Status(*Visit)(TElemType));

int main(int argc, char* argv[]) {
    BiTree testT;
    printf("请输入二叉树先序序列(如AB*C***): ");
    CreateBiTree(testT);
    printf("\n");
    printf("先序递归遍历顺序: ");
    PreOrderTraverse(testT, PrintElement);
    printf("\n");

    printf("请输入二叉树中序序列(如AB*C***): ");
    CreateBiTree(testT);
    printf("\n");
    printf("中序递归遍历顺序: ");
    InOrderTraverse(testT, PrintElement);
    printf("\n");

    printf("请输入二叉树后序序列(如AB*C***): ");
    CreateBiTree(testT);
    printf("\n");
    printf("后序递归遍历顺序: ");
    PostOrderTraverse(testT, PrintElement);
    printf("\n");

    printf("二叉树结点个数为:%d\n", Depth(testT));
    printf("二叉树深度为:%d\n", Depth(testT));

    printf("层次遍历顺序: ");
    LevelOrderTraverse(testT, PrintElement);
    printf("\n");

    return OK;
}

Status CreateBiTree(BiTree &T) {
    // 先序序列建立二叉树
    char ch;
    scanf("%c", &ch);
    if (ch == '*') {
        T = NULL;
    } else {
        if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) {
            return ERROR;
        }
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
    return OK;
}

Status PrintElement(TElemType e) {
    // 访问函数
    printf("%c", e);
    return OK;
}

Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
    // 先序遍历二叉树的递归算法
    if (T) {
        if (Visit(T->data)) {
            if (PreOrderTraverse(T->lchild, Visit)) {
                if (PreOrderTraverse(T->rchild, Visit)) {
                    return OK;
                }
            }
        }
        return ERROR;
    } else {
        return OK;
    }
}

Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
// 中序遍历二叉树的递归算法
if (T) {
if (InOrderTraverse(T->lchild, Visit)) {
if (Visit(T->data)) {
if (InOrderTraverse(T->rchild, Visit)) {
return OK;
}
}
}
return ERROR;
} else {
return OK;
}
}

Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
// 后序遍历二叉树的递归算法
if (T) {
if (PostOrderTraverse(T->lchild, Visit)) {
if (PostOrderTraverse(T->rchild, Visit)) {
if (Visit(T->data)) {
return OK;
}
}
}
return ERROR;
} else {
return OK;
}
}

int Depth(BiTree T) {
// 返回二叉树深度
if (T == NULL) {
return 0;
} else {
int left_depth = Depth(T->lchild);
int right_depth = Depth(T->rchild);
return (left_depth > right_depth ? left_depth : right_depth) + 1;
}
}

void LevelOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
// 层次遍历二叉树的算法
BiTNode *queue[STACK_INIT_SIZE];
int front = -1, rear = -1;
queue[++rear] = T;
while (front < rear) {
BiTNode *p = queue[++front];
Visit(p->data);
if (p->lchild != NULL) {
queue[++rear] = p->lchild;
}
if (p->rchild != NULL) {
queue[++rear] = p->rchild;
}
}
}
  

楼上的代码有点问题,函数声明那里使用的&对指针值修改但是函数结束后附加值就没了,Status CreateBiTree(BiTree &T)改成*T:

#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef char TElemType;
typedef int Status;
#define OK 1
#define ERROR 0

/* 二叉链表储存结构 */
typedef struct BiTNode {
    TElemType data;
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

/* 函数声明 */
Status CreateBiTree(BiTree* T);
Status PrintElement(TElemType e);
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType));
Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType));
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType));
int Depth(BiTree T);
void LevelOrderTraverse(BiTree b, Status(*Visit)(TElemType));

int main(int argc, char* argv[]) {
    BiTree testT;
    printf("请输入二叉树先序序列(如AB*C***): ");
    CreateBiTree(&testT);
    printf("\\n");
    printf("先序递归遍历顺序: ");
    PreOrderTraverse(testT, PrintElement);
    printf("\\n");

    printf("请输入二叉树中序序列(如AB*C***): ");
    CreateBiTree(&testT);
    printf("\\n");
    printf("中序递归遍历顺序: ");
    InOrderTraverse(testT, PrintElement);
    printf("\\n");

    printf("请输入二叉树后序序列(如AB*C***): ");
    CreateBiTree(&testT);
    printf("\\n");
    printf("后序递归遍历顺序: ");
    PostOrderTraverse(testT, PrintElement);
    printf("\\n");

    printf("二叉树结点个数为:%d\\n", Depth(testT));
    printf("二叉树深度为:%d\\n", Depth(testT));

    printf("层次遍历顺序: ");
    LevelOrderTraverse(testT, PrintElement);
    printf("\\n");

    return OK;
}

Status CreateBiTree(BiTree* T) {
    // 先序序列建立二叉树
    char ch;
    scanf("%c", &ch);
    if (ch == '*') {
        *T = NULL;
    } else {
        if (!(*T = (BiTNode*)malloc(sizeof(BiTNode)))) {
            return ERROR;
        }
        (*T)->data = ch;
        CreateBiTree(&((*T)->lchild));
        CreateBiTree(&((*T)->rchild));
    }
    return OK;
}

Status PrintElement(TElemType e) {
    // 访问函数
    printf("%c", e);
    return OK;
}

Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
    // 先序遍历二叉树的递归算法
    if (T) {
        if (Visit(T->data)) {
            if (PreOrderTraverse(T->lchild, Visit)) {
                if (PreOrderTraverse(T->rchild, Visit)) {
                    return OK;
                }
            }
        }
        return ERROR;
    } else {
        return OK;
    }
}

Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
// 中序遍历二叉树的递归算法
if (T) {
if (InOrderTraverse(T->lchild, Visit)) {
if (Visit(T->data)) {
if (InOrderTraverse(T->rchild, Visit)) {
return OK;
}
}
}
return ERROR;
} else {
return OK;
}
}

Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
// 后序遍历二叉树的递归算法
if (T) {
if (PostOrderTraverse(T->lchild, Visit)) {
if (PostOrderTraverse(T->rchild, Visit)) {
if (Visit(T->data)) {
return OK;
}
}
}
return ERROR;
} else {
return OK;
}
}

int Depth(BiTree T) {
// 返回二叉树深度
if (T == NULL) {
return 0;
} else {
int left_depth = Depth(T->lchild);
int right_depth = Depth(T->rchild);
return (left_depth > right_depth ? left_depth : right_depth) + 1;
}
}

void LevelOrderTraverse(BiTree T, Status(*Visit)(TElemType)) {
// 层次遍历二叉树的算法
BiTNode *queue[STACK_INIT_SIZE];
int front = -1, rear = -1;
queue[++rear] = T;
while (front < rear) {
BiTNode *p = queue[++front];
Visit(p->data);
if (p->lchild != NULL) {
queue[++rear] = p->lchild;
}
if (p->rchild != NULL) {
queue[++rear] = p->rchild;
}
}
}