在昨天的博客中遇到了一点点问题,我尝试了单步调试不过由于输入的问题导致了调试的结果很不顺利,于是我就决定利用一个数组来解放掉输入,于是代码就被我进行了一点小小的修改:
#include <stdio.h>
#include <stdlib.h>
#define Status int
#define OK 1
#define OVERFLOW -99
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BitNode, * BiTree;
// 定义了用来进行调试的数据
char str[4] = {'a','#','#','#'};
int i = 0;
Status CreateBiTree(BiTree &T);
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType e));
int main(void)
{
BiTree T;
CreateBiTree(T);
system("pause");
}
Status CreateBiTree(BiTree &T)
{
// 按先序输入到二叉树中的值,空格表示空树
// 构造链式二叉树
// 看这里代替了原有的输入
TElemType ch = str[i];
i++;
//scanf("%c",&ch);
if(ch == '#') T = NULL;
else
{
T = (BitNode *)malloc(sizeof(BitNode));
if(!T) exit(OVERFLOW);
else
{
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
return OK;
}
结果运行就正常了,后来还是小提提(刚刚被纠正要称呼她为女神,不然会被打死)指出这应该是scanf将回车也认定为是一个字符导致的,因此要在scanf函数后面加入一个getchar()函数,修改后如下所示:
Status CreateBiTree(BiTree &T)
{
// 按先序输入到二叉树中的值,空格表示空树
// 构造链式二叉树
TElemType ch;
scanf("%c",&ch);
getchar();
if(ch == '#') T = NULL;
else
{
T = (BitNode *)malloc(sizeof(BitNode));
if(!T) exit(OVERFLOW);
else
{
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
return OK;
}
然后我就想起之前在利用堆栈处理字符串时遇到的一个诡异的问题其实也是此原因导致的。
接下来再来实现二叉树的三种遍历即先序遍历、中序遍历和后序遍历:
#include <stdio.h>
#include <stdlib.h>
#define Status int
#define OK 1
#define OVERFLOW -99
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BitNode, * BiTree;
Status CreateBiTree(BiTree &T);
// 先序遍历
Status PreOrderTraverse(BiTree T);
// 中序遍历
Status InOrderTraverse(BiTree T);
// 后序遍历
Status PostOrderTraverse(BiTree T);
int main(void)
{
BiTree T;
CreateBiTree(T);
printf("下面显示二叉树\n");
PreOrderTraverse(T);
system("pause");
}
Status CreateBiTree(BiTree &T)
{
// 按先序输入到二叉树中的值,空格表示空树
// 构造链式二叉树
TElemType ch;
scanf("%c",&ch);
getchar();
if(ch == '#') T = NULL;
else
{
T = (BitNode *)malloc(sizeof(BitNode));
if(!T) exit(OVERFLOW);
else
{
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
return OK;
}
// 通过这一部分可以看出如果采用递归的方法对二叉树进行遍历是一件非常容易的事情
Status PreOrderTraverse(BiTree T)
{
if(T)
{
printf("%c", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}
Status InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%c", T->data);
InOrderTraverse(T->rchild);
}
return OK;
}
Status PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c", T->data);
}
return OK;
}
最后再来一张大图展示运行结果以此弥补自己好久不写博客的罪过。