#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
char data;
struct node *Lchild;
struct node *Rchild;
}*BiTree,BiNode;
int Mark_Root_Pos(char in[], char post[], int n);
int PrintfPreOrder(BiTree root);
BiTree Creat_Tree(char in[], char post[], int n);
int main()
{
int len;
BiTree root;
char in[50],post[50];
scanf("%s",in);
len=strlen(in);
if(len>=50)
{
printf("OVER\n");
exit(0);
}
scanf("%s",post);
root = Creat_Tree(in,post,len);
PrintfPreOrder(root);
return 0;
}
int Mark_Root_Pos(char pre[], char in[], int n)
{
int i;
char ch;
for(i=0, ch=pre[0]; i<n; i++) //后序遍历最后一个是根节点
{
if(in[i]==ch) //相等中序i的左边是根节点的左子树,右边是右子树
{
return i;
}
}
return 0;
}
int PrintfPreOrder(BiTree root)
{
if(root)
{
PrintfPreOrder(root->Lchild);
PrintfPreOrder(root->Rchild);
printf("%c", root->data);
}
return 0;
}
BiTree Creat_Tree(char pre[], char in[], int n)
{
BiTree root;
int i;
if(n==0)
return NULL;
i=Mark_Root_Pos(pre,in, n);
root = (BiTree)malloc(sizeof(BiNode));
root->data = pre[0];
root->Lchild = Creat_Tree(pre+1,in,i);
root->Rchild = Creat_Tree(pre+i+1,in+i+1, n-i-1); //因为post的i之前的都一定是左子树的值,所以post+i就移动到了右子树上了,始终是从最后一个进行判断
return root;
}
通过中序后序建立二叉树
最新推荐文章于 2022-11-23 16:48:39 发布