Binary Tree Traversals(二叉树)
前序:1 2 4 7 3 5 8 9 6(已知)
中序:4 7 2 1 8 5 9 3 6(已知)
后序:7 4 2 8 9 5 6 3 1(求)
HD 1701
/******************************************************模拟堆栈实现*********************************************************************/
/*********数的遍历先左子树在右子树当左子树为空是递归到上一层当右子树为空时也递归到上一层,当第一次遇到该结点是写入前序,第二次遇到时写入中序,第三次遇到时写入后序,入栈(出栈)一次为遇到一次*********************************************************************************/
#include<stdio.h>
#include<string.h>
#define N 1001
int main()
{
int i,j,k,top,count,n;
int pre[N],mid[N],stack[N];
while(scanf("%d",&n)!=EOF){
count=0;
for(i=0;i<n;i++)
scanf("%d",&pre[i]);
for(i=0;i<n;i++)
scanf("%d",&mid[i]);
for(i=0,j=0,top=0;i<n;i++){
for(k=0;k<top-1;k++){
if(mid[i]==stack[k]){
while(top!=k+1){
if(count++)printf(" ");
printf("%d",stack[--top]);
}break;
}
}
while(1){
if(stack[top-1]==mid[i])break;
stack[top++]=pre[j++];
}
}
for(i=top-1;i>=0;i--){
if(count++)printf(" ");
printf("%d",stack[i]);
}
printf("\n");
}
return 0;
}
/******************************************************递归*****************************************************************************************/
/*********如果有子树则继续递归(递归遵循先左后右)寻找第一个无子树的结点即为二叉树的后序的第一个,遍历过后可将此结点看为空,输出并返回上一层************************************************/
#include<stdio.h>
int count;
void next(int pre[],int mid[],int n)
{
int i,k;
int ppre[1001],mmid[1001];
for(i=0;pre[0]!=mid[i]&&i<n;i++);
if(i){ //有左子树
for(k=0;k<i;k++){
ppre[k]=pre[k+1];
mmid[k]=mid[k];
}
next(ppre,mmid,i); //递归
}
if(i!=n-1){ //有右子树
for(k=i+1;k<n;k++){
ppre[k-i-1]=pre[k];
mmid[k-i-1]=mid[k];
}
next(ppre,mmid,n-i-1); //递归
}
if(count++)
printf(" %d",pre[0]);
else printf("%d",pre[0]);
}
int main()
{
int pre[1001],mid[1001],i,n;
while(scanf("%d",&n)!=EOF){
count=0;
for(i=0;i<n;i++)scanf("%d",&pre[i]);
for(i=0;i<n;i++)scanf("%d",&mid[i]);
next(pre,mid,n);
printf("\n");
}
}