您的位置:首页 > 其它

Binary Tree Traversals(二叉树)

2010-07-17 11:24 183 查看


前序: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

pk Tree Recovery

/******************************************************模拟堆栈实现*********************************************************************/

/*********数的遍历先左子树在右子树当左子树为空是递归到上一层当右子树为空时也递归到上一层,当第一次遇到该结点是写入前序,第二次遇到时写入中序,第三次遇到时写入后序,入栈(出栈)一次为遇到一次*********************************************************************************/

#include<stdio.h>
#include<string.h>
#define N 1001
int main()
{
int i,j,k,top,count,n;
int pre
,mid
,stack
;
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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: