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