1)中序和后序得到的左右子树的根的特点
左子树根pos = 原先根pos-右子树个数(end-mid+1)
右子树根pos = 原先根pos-1
先序遍历输出
void pre(int root,int start,int end)
{
if(start>end) return ; //退出条件,这棵树的范围为0
int i=start;
while(i<end&&b[i]!=a[root]) i++; //在后序序列中确定根之后在中序序列中找他的所在位置
cout<<a[root]<<" "; //输出找到的根
pre(root-1-end+i,start,i-1); //左子树的根下标即为在后序序列中根节点的位置-右子树的个数(root-(end-i+1))
pre(root-1,i+1,end); //根的下标-1就是它的右子树的根的下标(root-1)
}
层次遍历输出
void travel(int root,int index,int start,int endd)
{
if(start>endd)
return;
a[index]=post[root];
int key=start;
while( key<endd && in[key]!=post[root] )
{
key++;
}
int left_len=key-start;
int right_len=endd-key;
travel(root-endd+key-1,index*2+1,start,key-1);
travel(root-1,index*2+2,key+1,endd);
}
----------------------------------------------------------------------------------------------------------------------------
’
2)先序和中序得到左右子树的根的特点
左子树根pos = 原先根pos+1
右子树根pos = 原先根pos+左子树个数(mid-start+1)
后序遍历输出
void post(int root, int start, int end) {
if(start > end)
return ;
int i = start;
while(i < end && in[i] != pre[root]) i++;
post(root + 1, start, i - 1);
post(root + 1 + i - start, i + 1, end);
printf("%d ", pre[root]);
}
层次遍历输出
void levelorder(int root,int start,int end,int index)
{
if(start>end) return ;
int i=start;
while(i<end&&pre[root]!=in[i]) i++;
level[index]=pre[root];
levelorder(root+1,start,i-1,2*index+1);
levelorder(root+1+i-start,i+1,end,2*index+2);
}
最后得出树的时候,先要memset数组为-1
然后:
memset(a,-1,sizeof(a));
for(int i=0;i<1000000;i++)
{
if(level[i]==-1) continue;
cnt++;
if(i) cout<<" ";
cout<<level[i];
if(cnt==n) break;
}