zoukankan      html  css  js  c++  java
  • 九度 题目1523:从上往下打印二叉树 题目1521:二叉树的镜像

    题目1523:从上往下打印二叉树

    题目描述:

    从上往下打印出二叉树的每个节点,同层节点从左至右打印。

    输入:

    输入可能包含多个测试样例,输入以EOF结束。
    对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
    Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
    Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
    Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
    Ci=’z’表示第i个节点没有子孩子。

    输出:

    对应每个测试案例,
    按照从上之下,从左至右打印出二叉树节点的值。

    样例输入:
    7
    8 6 5 7 10 9 11
    d 2 5
    d 3 4
    z
    z
    d 6 7
    z
    z
    
    样例输出:
    8 6 10 5 7 9 11

    二叉树的遍历: 广搜 ,特别适合考研看看。 先序,深搜。我觉得还是要注重基础,这些东西还是有用的。
    #include <iostream>
    #include <string.h>
    #include <string>
    #include <algorithm>
    #include <stdio.h>
    #include <queue>
    #include <set>
    #include <limits.h>
    #include <fstream>
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std ;
    const int size=1008 ;
    struct Me{
       struct Node{
           int left ;
           int right ;
       };
       Node node[size];
       int N ;
       int turn[size] ;
       vector<int>ans ;
       Me(){}
       Me(int n):N(n){}
       void make_grap(){
          char str[2] ;
          for(int i=1;i<=N;i++){
             scanf("%d",&turn[i]) ;
             node[i].left=node[i].right=0 ;
          }
          for(int i=1;i<=N;i++){
             scanf("%s",str) ;
             if(str[0]=='d')
                scanf("%d%d",&node[i].left,&node[i].right) ;
             else if(str[0]=='l')
                 scanf("%d",&node[i].left) ;
             else if(str[0]=='r')
                 scanf("%d",&node[i].right) ;
          }
       }
       void bfs(){
          queue<int>que ;
          que.push(1) ;
          while(!que.empty()){
              int now=que.front() ;
              que.pop() ;
              ans.push_back(turn[now]) ;
              if(node[now].left)
                  que.push(node[now].left) ;
              if(node[now].right)
                  que.push(node[now].right) ;
          }
       }
       void gao_qi(){
          make_grap() ;
          ans.clear() ;
          bfs() ;
          printf("%d",ans[0]) ;
          for(int i=1;i<ans.size();i++)
             printf(" %d",ans[i]) ;
          puts("") ;
       }
    };
    int main(){
       int n ;
       while(scanf("%d",&n)!=EOF){
           Me me(n) ;
           me.gao_qi() ;
       }
       return 0 ;
    }

    题目1521:二叉树的镜像

    时间限制:1 秒

    题目描述:

    输入一个二叉树,输出其镜像。

    输入:

    输入可能包含多个测试样例,输入以EOF结束。
    对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
    Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
    Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
    Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
    Ci=’z’表示第i个节点没有子孩子。

    输出:

    对应每个测试案例,
    按照前序输出其孩子节点的元素值。
    若为空输出NULL。

    样例输入:
    7
    8 6 10 5 7 9 11
    d 2 3
    d 4 5
    d 6 7
    z
    z
    z
    z
    样例输出:
    8 10 11 9 6 7 5


    #include <iostream>
    #include <string.h>
    #include <string>
    #include <algorithm>
    #include <stdio.h>
    #include <queue>
    #include <set>
    #include <limits.h>
    #include <fstream>
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std ;
    const int size=1008;
    struct Me{
       int N ;
       int turn[size] ;
       vector<int>ans ;
       struct Node{
           int left ;
           int right ;
       }node[size];
       Me(){}
       Me(int n):N(n){}
       void make_grap(){
          char str[2] ;
          int x , y ;
          for(int i=1;i<=N;i++)
            scanf("%d",&turn[i]) ;
          for(int i=1;i<=N;i++){
              scanf("%s",str) ;
              if(str[0]=='d'){
                  scanf("%d%d",&x,&y) ;
                  node[i].left=y ;
                  node[i].right=x ;
              }
              else if(str[0]=='l'){
                  scanf("%d",&x) ;
                  node[i].right=x ;
                  node[i].left=0 ;
              }
              else if(str[0]=='r'){
                  scanf("%d",&x) ;
                  node[i].left=x ;
                  node[i].right=0 ;
              }
              else
                  node[i].left=node[i].right=0 ;
          }
       }
       void dfs(int now){
          // puts("--") ;
           ans.push_back(turn[now]) ;
           if(node[now].left)
               dfs(node[now].left) ;
           if(node[now].right)
               dfs(node[now].right) ;
       }
       void gao_qi(){
           make_grap() ;
           ans.clear() ;
           dfs(1) ;
           printf("%d",ans[0]) ;
           for(int i=1;i<ans.size();i++)
             printf(" %d",ans[i]) ;
           puts("") ;
       }
    };
    int main(){
       int n ;
       while(cin>>n){
          Me me(n) ;
          me.gao_qi() ;
       }
       return 0 ;
    }
  • 相关阅读:
    java中的重绘
    引起共鸣的句子【转自知乎】
    东大校园网一键登录
    java用字符写字符
    Xshell 配置上传下载命令 rz sz 以及配置复制和粘贴
    【测试工程师面试】 记录XX银行面试
    常见的加密解密算法
    SHA-256 加密原理
    Spring boot 整合JSP开发步骤
    Spring boot @Scheduled(cron = "* * * * * *") cron表达式详解
  • 原文地址:https://www.cnblogs.com/liyangtianmen/p/3252215.html
Copyright © 2011-2022 走看看