雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1020. Tree Traversals (25) ——树的遍历

Posted on 2013-09-30 18:49  huhuuu  阅读(903)  评论(0编辑  收藏  举报

//题目 通过后续遍历 中序遍历 得出一棵树 ,然后按树的层次遍历打印

PS:以前对于这种用指针的题目是比较头痛的,现在做了一些链表操作后,感觉也不难

先通过后续中序建一棵树,然后通过BFS遍历这棵树

提供测试样例

4
4 1 3 2
2 3 1 4
10
10 7 6 9 8 5 4 1 3 2
7 10 6 2 5 9 8 3 1 4

//题目 通过后续遍历 中序遍历 得出一棵树 ,然后按树的层次遍历打印
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;

int back[90];
int mid[90];
int n;

struct data{
    int v;
    int no;
    data *left,*right;
};

data *head=new data;
data *rhead=head;
void build(){
    int i,j;    
    head->v=back[n];
    head->left=NULL;
    head->right=NULL;
    
    int root=n,rj;
    for(j=1;j<=n;j++){
        if(back[n]==mid[j]){
            head->no=j;break;
        }
    }
    for(i=n-1;i>=1;i--){
        for(j=1;j<=n;j++){
            if(back[i]==mid[j]){
                rj=j;break;
            }
        }
        head=rhead;
        while(1){
            if((rj < head->no)&&head->left!=NULL){
                head=head->left;continue;
            }
            if((rj > head->no)&&head->right!=NULL){
                head=head->right;continue;
            }break;
        }
        if(rj < head->no){
            head->left=new data;
            head=head->left;
            head->v=back[i];
            head->no=rj;
            head->left=NULL;
            head->right=NULL;
        }else{
            head->right=new data;
            head=head->right;
            head->v=back[i];
            head->no=rj;
            head->left=NULL;
            head->right=NULL;
        }
    }

}

void bfs(){
    data *first,*second;
    first=rhead;
    queue<data *>qq;
    qq.push(first);

    int ok=0;
    while(!qq.empty()){

        if(ok==0){
            ok=1;
            printf("%d",qq.front()->v);
        }else{
            printf(" %d",qq.front()->v);
        }
        second=qq.front();
        qq.pop();
        if(second->left!=NULL){
            qq.push(second->left);
        }
        if(second->right!=NULL){
            qq.push(second->right);
        }
    }
    printf("\n");
}

int main()
{
    while(scanf("%d",&n)!=EOF){
        int i;
        head=new data;
        rhead=head;
        for(i=1;i<=n;i++){
            scanf("%d",&back[i]);
        }
        for(i=1;i<=n;i++){
            scanf("%d",&mid[i]);
        }
        build();
        bfs();
    }

    return 0;
}
View Code