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