我有这样的思路:
由先根起,每一个数字都找到它在中根序列中的位置,找出他在中根序列中最近的左右的已被放进树里的元素(设为A,B)。若B左子女空 && A右子女满,则放在B左子女处。反之放A右子女。放进之后删除记录。
可是具体实现却出现问题……我们要用左右指针的二叉树写……就有点手足无措……
希望大家给我思路!一起交流!谢谢!
#include<iostream>
using namespace std;
#define N 7
typedef struct Tnode{
struct Tnode *lchild;
struct Tnode *rchild;
char data;
}*BiTree;
void Rebuild(BiTree &T,char A[N+1],char B[N+1],int &count,int low,int high)
{
if(count<=N)
{
if(low>high)
{
T=NULL;
count--;
}
else
{
T=(BiTree)malloc(sizeof(struct Tnode));
T->data=A[count];
for(int i=low;i<=high && B[i]!=A[count];i++);//找到根节点
Rebuild(T->lchild,A,B,++count,low,i-1);//这里的count++与++count有区别
Rebuild(T->rchild,A,B,++count,i+1,high);
}
}
else
T=NULL;
}
void print(BiTree T,int k)
{
if(T)
{
k+=5;
print(T->rchild,k);
for(int i=0;i<k;i++)
cout<<" ";
cout<<T->data<<endl;
print(T->lchild,k);
}
}
int main()
{
BiTree t;
int count=1;
char A[N+2]={'0','1','2','4','5','3','6'};//前序
char B[N+2]={'0','4','2','5','1','3','6'};//中序
Rebuild(t,A,B,count,1,N);
print(t,0);
return 0;
}