NOJ-建立二叉树的二叉链表-西工大数据结构

    今天回到宿舍发现网站挂了,11点再试发现好了,赶紧做了一道。题目如下:


    分析一下题目,就是用前序和中序拼一个二叉树出来,再后序输出。

    创建二叉树时,前序中第一个数据肯定是根节点,然后在中序中这个数据肯定把中序序列分成左半部分和右半部分,左半部分就是这个数据节点的左支,右半部分就是右支,然后再对左支和右支创建二叉树,构成一个递归。则ABCDE  BADCE,可转化成以下二叉树:


    输出也选择递归的方法,先左支后右支该节点即可。

    以下是我的实现:

#include <stdio.h>
#include <stdlib.h>

struct binaryTree
{
    char data;
    struct binaryTree *left;
    struct binaryTree *right;
};

char preOrder[50]={0};
char midOrder[50]={0};

void run ();
void inputBinaryTree ();
int getLength ();
int findMid (int left,int right,char mid);
struct binaryTree *createBinaryTree (int left,int right,int *i);
void printBinaryTree (struct binaryTree *head);

int main()
{
    run ();
    return 0;
}

void inputBinaryTree ()
{
    gets(preOrder);
    gets(midOrder);
}

void run ()
{
    inputBinaryTree ();

    int right,left=0;
    right=getLength ();

    int i=0;
    struct binaryTree *head;
    head=createBinaryTree (left,right,&i);

    printBinaryTree (head);
}

int getLength ()
{
    int i=0;
    while (1)
    {
        if (!preOrder[i])
        {
            return i-1;
        }
        i++;
    }
}

int findMid (int left,int right,char mid)
{
    int i;
    for (i=left;i<=right;i++)
    {
        if (midOrder[i]==mid)
        {
            return i;
        }
    }
    return 0;
}

struct binaryTree *createBinaryTree (int left,int right,int *i)
{

    struct binaryTree *cur;
    cur=(struct binaryTree*)malloc(sizeof(struct binaryTree));
    cur->data=preOrder[(*i)];
    cur->left=NULL;
    cur->right=NULL;
    (*i)++;

    int mid;
    mid=findMid (left,right,cur->data);

    if (mid>left)
    {
        cur->left=createBinaryTree (left,mid-1,i);
    }
    if (mid<right)
    {
        cur->right=createBinaryTree (mid+1,right,i);
    }

    return cur;

};

void printBinaryTree (struct binaryTree *head)
{
    if (head->left)
    {
        printBinaryTree (head->left);
    }
    if (head->right)
    {
        printBinaryTree (head->right);
    }
    printf ("%c",head->data);
}

    下面是各函数的注释:

void inputBinaryTree ()
{
    gets(preOrder);//读入两行字符串
    gets(midOrder);
}
int getLength ()
{
    int i=0;
    while (1)
    {
        if (!preOrder[i])//若是‘\n’,就返回
        {
            return i-1;//返回字符串最右元素的位置
        }
        i++;
    }
}
int findMid (int left,int right,char mid)
{
    int i;
    for (i=left;i<=right;i++)//在left和right之间遍历
    {
        if (midOrder[i]==mid)//若找到
        {
            return i;//返回该元素位置
        }
    }
    return 0;
}
struct binaryTree *createBinaryTree (int left,int right,int *i)//i用于在整个递归中遍历前序字符串,所以采取指针
{

    struct binaryTree *cur;//创建节点,初始化,并读入数据
    cur=(struct binaryTree*)malloc(sizeof(struct binaryTree));
    cur->data=preOrder[(*i)];
    cur->left=NULL;
    cur->right=NULL;
    (*i)++;//得到下一个作为节点的前序字符串的位置

    int mid;
    mid=findMid (left,right,cur->data);//找到根节点位置

    if (mid>left)//若左支不为NULL(若mid=left说明左支没有元素了)
    {
        cur->left=createBinaryTree (left,mid-1,i);//在左支中递归
    }
    if (mid<right)//同上
    {
        cur->right=createBinaryTree (mid+1,right,i);
    }

    return cur;//返回当前节点地址,便于递归

};
void printBinaryTree (struct binaryTree *head)
{
    if (head->left)
    {
        printBinaryTree (head->left);//递归输出左支
    }
    if (head->right)
    {
        printBinaryTree (head->right);//递归输出右支
    }
    printf ("%c",head->data);//输出当前节点
}
void run ()
{
    inputBinaryTree ();//输入

    int right,left=0;//初始化最左端
    right=getLength ();//得到最右端

    int i=0;
    struct binaryTree *head;
    head=createBinaryTree (left,right,&i);//创建二叉树

    printBinaryTree (head);//输出
}
    以上就是我的实现,希望给大家带来帮助。





猜你喜欢

转载自blog.csdn.net/qq_30180107/article/details/79905336