今天回到宿舍发现网站挂了,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);//输出
}
以上就是我的实现,希望给大家带来帮助。