2017-11-26 7 views
0
vector<vector<int>> levelOrder(TreeNode* root) { 
    vector<vector<int>> result; 
    queue<TreeNode *> que; 

    if (root != nullptr) { 
     que.emplace(root); 
    } 

    while (!que.empty()) { 
     vector<int> level; 
     int size = que.size(); 
     for (int i = 0; i < size; i++) { 
      auto *front = que.front(); 
      que.pop(); 
      level.emplace_back(front->val); 
      if (front->left != nullptr) { 
       que.emplace(front->left); 
      } 
      if (front->right != nullptr) { 
       que.emplace(front->right); 
      } 
     } 
     result.emplace_back(move(level)); 
    } 

    return result; 
} 

問題:上記https://leetcode.com/problems/binary-tree-level-order-traversal/description/これはベクターを初期化する悪い方法ですか?

>はベクトルを返す関数です。

しかし、ベクトルをローカル変数vector<vector<int>> result;として初期化したので、それを返すコードの匂いであることを意味していますか?

ベクトルはローカル変数であるため、スタック上に割り当てられ、この関数呼び出しが終了するとベクターは破棄されます。ソフトウェアは、私はその時に停止することはできませんので

私が代わりにauto results = new vector<vector<int>>

+2

ベクターのコピーを返します。完全にOKです。 –

+1

'新しいベクトル>'バージョンはお勧めしません。価値によって戻ってくることが最善の方法です。 – Galik

+0

構文 'if(root!= NULL){...}'をお勧めします。それとも、さらに良い 'if(root!= 0){...}' – paulsm4

答えて

4

これを行っているならば、私は詳しく説明します。 「いいえ」は質問にのみ適用されます。私はエラーのコードをチェックしていません。それで、いいえ、書いたように結果を返すのは間違いではありません。費用はかかりません。最新のコンパイラはreturn-value optimizationを使用して結果を返します。

operator newを使用することは非常に悪いフォームです。そうすることで、呼び出し関数にオブジェクトを削除する負担がかかります。 "C++ RAII"を検索してください。

+2

なぜ落札ですか?これが間違っている場合は、理由を教えてください。 –

+0

"そうすることで、呼び出し関数にオブジェクトを削除する負担がかかります。" - それが私たちがスマートポインタを持っている理由です。 –

+2

@Neil - 真。しかし、ここでポインタを使用する理由はありません、スマート、愚かな、または平均IQの。 –

関連する問題