一开始是为了解决这个问题,然后就发现网上要么是局部代码,要么就运行不了。
存储结构
typedef struct BiTNode
{
ElemType data;//数据结点数据域
struct BiTNode *lchild, *rchild;//左孩子,右孩子结点指针域
}BiTNode,*BiTree;
输入的设计
printf("请按完全二叉树的存储方式输入结点数据,没有结点不存在请使用空格代替,节点只允许使用字母形式,如 A,a,B,b等,出现其他字符直接终止!!!\n");
char a[MaxSize];
scanf("%[A-Z a-z]",a);// abc def g h
int i=0;int length=strlen(a);
printf("打印刚刚的输入:长度%d\t\n",length);
int x=0;
for(i=1;i<length;i++){
if((int)((log(i)/log(2)))>x){
printf("\n");
x=log(i)/log(2);
}
if(a[i]==' '){
printf("0\t");
}else{
// printf("%d号%c\t",i+1,a[i]);
printf("%c\t",a[i]);
}
}printf("\n");
这是本次设计的亮点,用scanf正则匹配的方式,简化了输入的操作,也实现了输入的树的结构可视化。
所有代码
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;//数据结点数据域
struct BiTNode *lchild, *rchild;//左孩子,右孩子结点指针域
}BiTNode,*BiTree;
//约定通过前序遍历创建结点
//每个结点都有左右孩子,孩子不存在为NULL
void CreatBiTree(BiTree *tree,char *A,int i,int length)
{
if(i>=length||A[i]==' ')
{//注意这边与答案的不同,NULL表示没有这个数据,‘ ’空表示有这个数据不过值为空格,相当于答案的 i>=max||A[i]==' '
(*tree) = NULL;
}else
{
ElemType a=A[i];
printf("%c\t",a);
(*tree)=(BiTree)malloc(sizeof(BiTNode));
(*tree)->data = a;
if(A[2*i]!=NULL||A[2*i]!=' ')
{
//左孩子不为空,没有这个节点
CreatBiTree(&((*tree)->lchild),A,2*i,length);//创建左子树
}
if(A[2*i+1]!=NULL||A[2*i+1]!=' ')
{
//右孩子不为空,没有这个节点
CreatBiTree(&((*tree)->rchild),A,2*i+1,length);//创建右子树
}
}
}
void visit(ElemType data,int level)
{
printf("%c 第%d层\n", data,level);
return;
}
//前序遍历
void PreOrderTraverse(BiTree tree,int level)
{
if (NULL != tree)
{
visit(tree->data, level);
PreOrderTraverse(tree->lchild, level + 1);
PreOrderTraverse(tree->rchild, level + 1);
}
}
//中序遍历
void MidOrderTraverse(BiTree tree, int level)
{
if (NULL != tree)
{
MidOrderTraverse(tree->lchild, level + 1);
visit(tree->data, level);
MidOrderTraverse(tree->rchild, level + 1);
}
}
//后序遍历
void PostOrderTraverse(BiTree tree, int level)
{
if (NULL != tree)
{
PostOrderTraverse(tree->lchild, level + 1);
PostOrderTraverse(tree->rchild, level + 1);
visit(tree->data, level);
}
}
int main(int argc, char *argv[])
{
BiTree tree = NULL;
printf("请按完全二叉树的存储方式输入结点数据,没有结点不存在请使用空格代替,节点只允许使用字母形式,如 A,a,B,b等,出现其他字符直接终止!!!\n");
char a[MaxSize];
scanf("%[A-Z a-z]",a);// abc def g h
int i=0;int length=strlen(a);
printf("打印刚刚的输入:长度%d\t\n",length);
int x=0;
for(i=1;i<length;i++){
if((int)((log(i)/log(2)))>x){
printf("\n");
x=log(i)/log(2);
}
if(a[i]==' '){
printf("0\t");
}else{
// printf("%d号%c\t",i+1,a[i]);
printf("%c\t",a[i]);
}
}printf("\n");
printf("前序创建:");
CreatBiTree(&tree,a,1,length);
printf("\n前序遍历:\n");
PreOrderTraverse(tree, 1);
printf("中序遍历:\n");
MidOrderTraverse(tree, 1);
printf("后序遍历:\n");
PostOrderTraverse(tree, 1);
return 0;
}