【LeetCode & 劍指offer刷題】熟悉OJ平台3:OJ編程實例


【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

 

OJ編程實例

給定一棵二叉樹的前序(根、左、右)和中序(左、根、右)的打印結果,輸出此二叉樹按層(從左往右)打印結果。
例如一棵二叉樹前序:1 2 4 5 3;中序:4 2 5 1 3。可以構建出下圖所示二叉樹:
 
 
按層打印的結果則為:1 2 3 4 5。
按層打印二叉樹(去哪兒網2017春招真題)
題目描述
 
輸入
第一行只有一個數字,表示二叉樹的節點數n(1<=n<=1000);
第二行由a1,a2,...,an(1<=ai<=1000)組成的整數序列(用空格分隔)—表示前序打印結果;
第三行由b1,b2,...,bn(1<=bi<=1000)組成的整數序列(用空格分隔)—表示中序打印結果。
 
樣例輸入
5
1 2 4 5 3
4 2 5 1 3
 
輸出
c1,c2,...,cn,用空格分隔—表示按層打印的結果。
 
樣例輸出
1 2 3 4 5
 
時間限制
C/C++語言:2000MS
其它語言:4000MS
內存限制
C/C++語言:65536KB
其它語言:589824KB
 
 
using namespace std ;
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
struct TreeNode
{
     int val ;
    TreeNode * left ;
    TreeNode * right ;
    TreeNode ( int x ) : val ( x ), left ( NULL ), right ( NULL ) {} // 參數初始化列表
};
using iter = vector < int >:: iterator ;
TreeNode * createTree ( iter prebegin , iter preend , iter inbegin , iter inend );
void levelOrder ( TreeNode * root );
int main ()
{
/*  if (freopen("./src/input.txt", "r", stdin))// 代替手工輸入 , 需加 <cstdio> 頭文件 ,vs 默認路徑起點為工程文件所在的目錄
        cout << " 讀取成功 " << endl;
    else
        cout << " 讀取文件失敗 " << endl;*/
     int n ;
    cin >> n ;
    vector < int > preorder ( n );
    vector < int > inorder ( n );
     for ( int i = 0 ; i < n ; i ++)
     {
        cin >> preorder [ i ];
     }
     for ( int i = 0 ; i < n ; i ++)
     {
        cin >> inorder [ i ];
     }
    TreeNode * root = createTree ( preorder . begin (), preorder . end (), inorder . begin (), inorder . end ());
    levelOrder ( root );
     return 0 ;
}
TreeNode * createTree ( iter prebegin , iter preend , iter inbegin , iter inend )
{
     if ( prebegin >= preend || inbegin >= inend ) return nullptr ;
    TreeNode * root = new TreeNode (* prebegin );
    iter root_pos = find ( inbegin , inend , root -> val );
     int left_length = root_pos - inbegin ;
    root -> left = createTree ( prebegin + 1 , prebegin + left_length + 1 , inbegin , root_pos );
    root -> right = createTree ( prebegin + left_length + 1 , preend , root_pos + 1 , inend );
     return root ;
}
void levelOrder ( TreeNode * root )
{
     if ( root == nullptr ) return ;
    queue < TreeNode *> q ;
    q . push ( root );
     while (! q . empty ())
     {
         int size = q . size ();
         for ( int i = 0 ; i < size ; i ++)
         {
            TreeNode * node = q . front ();
            cout << node -> val << ' ' ;
            q . pop ();
             if ( node -> left ) q . push ( node -> left );
             if ( node -> right ) q . push ( node -> right );
         }
     }
}
 
 
集合(京東2017秋招真題)
 
 
題目描述
 
 
給你兩個集合,要求 {A} + {B}。
注:同一個集合中不會有兩個相同的元素。
 
輸入
多組(不超過 5 組)數據。
每組輸入數據分為三行,第一行有兩個數字 n,m($0<n,m\leq10000$),分別表示集合 A 和集合 B 的元素個數。后兩行分別表示集合 A 和集合 B。每個元素為不超出 int 范圍的整數,每個元素之間有一個空格隔開。
 
樣例輸入

 

1 2
1
2 3
1 2
1
1 2
 
輸出
針對每組數據輸出一行數據,表示合並后的集合,要求從小到大輸出,每個元素之間有一個空格隔開。
樣例輸出

 

1 2 3
1 2
時間限制
C/C++語言:1000MS
其它語言:3000MS
內存限制
C/C++語言:65536KB
其它語言:589824KB
 
 
#include<iostream>
#include<set>
using namespace std ;
int main ()
{
  int m , n ;
  while(cin>>m>>n) //不確定會輸入多少組
  {
      set < int > s ;
      int t ;
      for ( int i = 0 ; i < m ;++ i )
      {
        cin >> t ;
        s . insert ( t );
      }
      for ( int i = 0 ; i < n ;++ i )
      {
        cin >> t ;
        s . insert ( t );
      }
     for ( set < int >:: iterator it = s . begin (); it != s . end (); it ++)
      {
          cout <<* it << " " ; //按從小到大輸出
      }
      cout << endl ;
  }
 
  return 0 ;
}
 
題目來源:http://exercise.acmcoder.com/online/online_judge_ques?ques_id=4172&konwledgeId=169
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM