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)