2012-02-08 13 views
1

バイナリ検索ツリーを使用するツリーの最も重いパスのすべてのint要素をベクトルに追加する必要があります。 たとえば、私は20,7,6,9,11,21 ベクトルに追加する必要がある値は20,7,9,11です 私は重いパスの計算の実装を書いているが、右の要素がベクトルに追加されますので、私はそれを変更する方法がわからない:バイナリ検索ツリー - 最も重いパスアルゴリズムを取得するC++

int Tree::maxBranch(Node* node){ 
    if(node==NULL) 
     return 0; 
    int leftSum=node->data+maxBranch(node->left); 
    int rightSum=node->data+maxBranch(node->right); 
    if(rightSum>leftSum){ 
     return rightSum; 
    } 
    return leftSum;  
} 

答えて

2

あなたのコードは、それはだ枝を追跡していませんそれに続く - それは合計を得るだけです。

std::vector<int>&を引数として変更する必要があります(効果的に2つの値を返す必要があるため、参照型の場合は&に注意してください)。

空のベクターで呼び出します。

あなたはnode->left上の再帰呼び出しを行う行する前に、あなたはインスタンスのよう元のベクトル、std::vector<int> vec_left(input_vector)std::vector<int> vec_right(input_vector)を保存する必要があります。次に、2つのコピーを再帰呼び出しに渡します。

コードでは、return rightSumの直前に、vec_right.push_back(node->id); input_vector = vec_right;が必要です。 の直前には、同様にvec_left.push_back(node->id); input_vector = vec_left;が必要です。英語では、総額が最も高い支店が行った経路を維持し、他のものを破棄します。

+0

非常にありがとう! – mary

+0

@maryもう1つの注意:ノードのIDをベースケースの戻り値( 'return 0'の前)に必ず追加してください。 – Borealid

0

クイック&汚い:書かれたよう

int Tree::maxBranch(Node* node, vector<int>& vec, bool add){ 
    if(node==NULL) 
     return 0; 
    int leftSum=node->data+maxBranch(node->left, vec, false); 
    int rightSum=node->data+maxBranch(node->right, vec, false); 
    if (add) 
     vec.push_back(node->data); 
    if(rightSum>leftSum){ 
     if (add) 
      maxBranch(node->right, vec, true); 
     return rightSum; 
    } 
    if (add) 
     maxBranch(node->left, vec, true); 
    return leftSum;  
} 
+0

これは非常に汚れています - あなたは、考えられるブランチに沿ったすべてのステップで 'maxBranch'を2回呼び出します。 – Borealid

+0

@Borealid - メモリ割り当てが少ないため、ソリューションよりパフォーマンスが優れている場合もあります。 – Henrik

+0

理想的な解決法は、パスを探索するための単一のベクトルを持つ明示的なスタックを使用しますが、私はそれを記述するのは嫌です。 – Borealid

関連する問題