九度 题目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 ;
}

 

转载于:https://www.cnblogs.com/liyangtianmen/p/3252215.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值