zoukankan      html  css  js  c++  java
  • 1020. Tree Traversals (25) ——树的遍历

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

    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("
    ");
    }
    
    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
  • 相关阅读:
    Revit 开发将自己的窗口设置为Revit窗口
    Revit api 创建楼梯图元
    Revit api 创建族并加载到当前项目
    tomcat源码阅读之BackupManager
    tomcat源码阅读之Tribes.RpcChannel
    tomcat源码阅读之集群
    Java单播、广播、多播(组播)---转
    tomcat源码阅读之默认连接器
    centos8运行脚本找不到python项目解决
    python虚拟环境冻结与安装
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3347700.html
Copyright © 2011-2022 走看看