1. 程式人生 > >【LeetCode & 劍指offer刷題】熟悉OJ平臺3:OJ程式設計例項

【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