主题:[原创]根据后序 前序建立二叉树
根据前序 后序序列建立的二叉树形态不唯一(单枝节点的左孩子 右孩子不好区分,这里作为左孩子)。
说明:首先根据两个序列,构建建立二叉树需要的输入序列。然后使用队列建树。
# include <stdio.h>
# include <stdlib.h>
# define M 50
# define N 30
typedef struct Tn
{
int data;
struct Tn *left;
struct Tn *right;
}TNode,*TLink;
int SearchV(int *a,int data)
{
int i;
for(i=0;data!=a[i];i++);
return i;
}
void PrintBtree(TLink root)
{
if(root!=NULL)
{
PrintBtree(root->left);
PrintBtree(root->right);
printf("%3d",root->data);
}
}
TLink CreateBtree(int InC[])
{
TLink root,Temp;
int Front=-1,Rear=-1;
int i=1;
TLink Que[30];
root=(TLink)malloc(sizeof(TNode));
root->data=InC[0];
Rear++;
Que[Rear]=root;
while(Front<Rear)
{
Front++;
Temp=Que[Front];
if(InC[i]!=0)
{
Temp->left=(TLink)malloc(sizeof(TNode));
Temp->left->data=InC[i];
Rear++;
Que[Rear]=Temp->left;
}
else
Temp->left=NULL;
i++;
if(InC[i]!=0)
{
Temp->right=(TLink)malloc(sizeof(TNode));
Temp->right->data=InC[i];
Rear++;
Que[Rear]=Temp->right;
}
else
Temp->right=NULL;
i++;
}
return root;
}
int main()
{
int Pre[]={8,5,1,3,2,4,6,7,10,9,11};
int Post[]={2,4,3,1,7,6,5,9,11,10,8};
int In_C[M],data;
int k=0,i=0,j;
int m,n,Ld,Rd;
TLink root;
In_C[0]=Pre[0];
while(k<=i) //以下为构建建立二叉树需要的输入序列
{
data=In_C[k];
if(data!=0)
{
m=SearchV(Pre,data);
n=SearchV(Post,data);
if(m+1>10)
Ld=0;
else
Ld=Pre[m+1];
for(j=i;j>=0;j--)
{
if(Pre[m+1]==In_C[j])
{
Ld=0;
break;
}
}
i++;
In_C[i]=Ld;
if(n-1<0)
Rd=0;
else
Rd=Post[n-1];
for(j=i;j>=0;j--)
{
if(Post[n-1]==In_C[j])
{
Rd=0;
break;
}
}
i++;
In_C[i]=Rd;
}
k++;
}
printf("\n");
root=CreateBtree(In_C);
PrintBtree(root);
return 1;
}
寒假里(1月25号以后)我想写些小游戏(希望写过的前辈能帮一下忙。感兴趣的大家一起写。我的邮箱:chch_1@sina.com)
说明:首先根据两个序列,构建建立二叉树需要的输入序列。然后使用队列建树。
# include <stdio.h>
# include <stdlib.h>
# define M 50
# define N 30
typedef struct Tn
{
int data;
struct Tn *left;
struct Tn *right;
}TNode,*TLink;
int SearchV(int *a,int data)
{
int i;
for(i=0;data!=a[i];i++);
return i;
}
void PrintBtree(TLink root)
{
if(root!=NULL)
{
PrintBtree(root->left);
PrintBtree(root->right);
printf("%3d",root->data);
}
}
TLink CreateBtree(int InC[])
{
TLink root,Temp;
int Front=-1,Rear=-1;
int i=1;
TLink Que[30];
root=(TLink)malloc(sizeof(TNode));
root->data=InC[0];
Rear++;
Que[Rear]=root;
while(Front<Rear)
{
Front++;
Temp=Que[Front];
if(InC[i]!=0)
{
Temp->left=(TLink)malloc(sizeof(TNode));
Temp->left->data=InC[i];
Rear++;
Que[Rear]=Temp->left;
}
else
Temp->left=NULL;
i++;
if(InC[i]!=0)
{
Temp->right=(TLink)malloc(sizeof(TNode));
Temp->right->data=InC[i];
Rear++;
Que[Rear]=Temp->right;
}
else
Temp->right=NULL;
i++;
}
return root;
}
int main()
{
int Pre[]={8,5,1,3,2,4,6,7,10,9,11};
int Post[]={2,4,3,1,7,6,5,9,11,10,8};
int In_C[M],data;
int k=0,i=0,j;
int m,n,Ld,Rd;
TLink root;
In_C[0]=Pre[0];
while(k<=i) //以下为构建建立二叉树需要的输入序列
{
data=In_C[k];
if(data!=0)
{
m=SearchV(Pre,data);
n=SearchV(Post,data);
if(m+1>10)
Ld=0;
else
Ld=Pre[m+1];
for(j=i;j>=0;j--)
{
if(Pre[m+1]==In_C[j])
{
Ld=0;
break;
}
}
i++;
In_C[i]=Ld;
if(n-1<0)
Rd=0;
else
Rd=Post[n-1];
for(j=i;j>=0;j--)
{
if(Post[n-1]==In_C[j])
{
Rd=0;
break;
}
}
i++;
In_C[i]=Rd;
}
k++;
}
printf("\n");
root=CreateBtree(In_C);
PrintBtree(root);
return 1;
}
寒假里(1月25号以后)我想写些小游戏(希望写过的前辈能帮一下忙。感兴趣的大家一起写。我的邮箱:chch_1@sina.com)