45-二叉树的构造测试代码

二叉树的构造测试代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 20

//二叉树结点
typedef struct BINARYNODE{
    char data;
    struct BINARYNODE* lchild;
    struct BINARYNODE* rchild;
}BinaryNode;


BinaryNode *CreateBT1(char *pre, char *in, int n)
{
    //k记录根节点的位置
    int k;
    BinaryNode *s = NULL;
    char *p = NULL;
    //如果给定的n小于等于0,则返回空
    if(n <= 0)
    {
        return NULL;
    }

    if(pre == NULL || in == NULL)
    {
        return NULL;
    }

    //以先序序列中的根节点来创建根节点
    s=(BinaryNode *)malloc(sizeof(BinaryNode));
    s->data = *pre;

    //在中序(in)中找根节点的位置k
    for (p=in; p<in+n; p++)
        if (*p==*pre)
            break;
    k=p-in;

    //构建左子树和右子树
    s->lchild=CreateBT1(pre+1,in,k);
    s->rchild=CreateBT1(pre+k+1,p+1,n-k-1);
    return s;
}

BinaryNode *CreateBT2(char *post , char *in, int n)
{
    BinaryNode *s = NULL;
    char *p = NULL;
    int len = strlen(post);
    int k;
    //ch记录根节点
    char ch = *(post + n - 1);
    if(n <= 0)
    {
        return NULL;
    }

    if(in == NULL || post == NULL)
    {
        return NULL;
    }

    //用后序序列中最后一个节点来创建根节点
    s = (BinaryNode *)malloc(sizeof(BinaryNode));
    s->data = ch;

    //在中序(in)中找根节点的位置k
    for (p=in; p<in+n; p++)
        if (*p == ch)
            break;
    k=p-in;

    //构造左子树和构造右子树
    s->lchild = CreateBT2(post,in,k);
    s->rchild = CreateBT2(post + k , p+1 , n-k-1);

    return s;
}


//先序遍历的递归算法
void PreOrder(BinaryNode *node)
{
    if(node != NULL)
    {
        printf("%c" , node->data);
        PreOrder(node->lchild);
        PreOrder(node->rchild);
    }
}

//中序遍历的递归算法
void InOrder(BinaryNode *node)
{
    if(node != NULL)
    {
        InOrder(node->lchild);
        printf("%c" , node->data);
        InOrder(node->rchild);
    }
}

//后序遍历的递归算法
void PostOrder(BinaryNode *node)
{
    if(node != NULL)
    {
        PostOrder(node->lchild);
        PostOrder(node->rchild);
        printf("%c" , node->data);
    }
}

int main(void)
{
    char *pre = "ABDGCEF";
    char *in = "DGBAECF";
    char *post = "GDBEFCA";
    int n = strlen(pre);
    BinaryNode *node = NULL;
    BinaryNode *node2 = NULL;

    printf("-------构造二叉树之前-----\n");
    printf("先序:%s\n" , pre);
    printf("中序:%s\n" , in);
    printf("后序:%s\n\n" , post);

    printf("-------以先序和中序构造二叉树-----\n");
    //以先序和中序构造二叉树
    node = CreateBT1(pre,in,n);
    printf("先序:");
    PreOrder(node);
    printf("\n");
    printf("中序:");
    InOrder(node);
    printf("\n\n");


    printf("-------以后序和中序构造二叉树-----\n");
    //以后序和中序构造二叉树
    node2 = CreateBT2(post,in,n);
    printf("后序:");
    PostOrder(node2);
    printf("\n");
    printf("中序:");
    InOrder(node2);
    printf("\n\n");

    return 0;
}



测试结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/80976648
今日推荐