全网“最靠谱”的二叉树的链式存储,使用前序方法读取“完全二叉树的数组结构“递归建树

一开始是为了解决这个问题,然后就发现网上要么是局部代码,要么就运行不了。

存储结构

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;
}

大家注意输入数据的结构就行了,慢慢体会,回味无穷,附一张测试的树的图。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值