2011-03-04 14 views
0
struct node 
{ 
    int data; 
    node* left; 
    node* right; 
}; 

int secondlargest(struct node* a) 
{ 
    while(a->right != NULL){ 
     secondlargest(a->right); 
    } 
    return a->data; 
} 

私は間違いをどこで実行したのか、なぜwhileループから出てこないのかをトレースすることはできません。無限ループ:プロセスが正しく終了しない

答えて

0

あなたが再帰バージョンを主張するならば、ifをifに変更してください。再帰の

int secondlargest(node* a) 
{ 
    if(a == null){ 
     // if the first node is already NULL 
     return -1; 
    } 
    if(a->right == NULL){ 
     return a->data; 
    }else{ 
     return secondlargest(a->right); 
    } 
} 

基礎:

  • を持たなければならない基本ケース
  • ブレークダウン問題のサイズを再帰的

あなたは、反復方法たい場合は:どのようなOMG

int secondlargest(node* a) 
{ 
    node* temp = a; 
    int data = -1; 
    while(temp != null){ 
     data = temp->data; 
     temp = temp->right; 
    } 
    return data; 
} 
+0

通常、メソッドを呼び出す前にa == nullをテストすると、メソッドがよりクリーンになり、今後失敗することがわかっているコールに対してこのテストが行​​われなくなります。 –

+0

うん、私の間違いがあった。ありがとう! – Ava

1

あなたが間違っているのは、再帰的であるためにwhileを使うのではなく、関数を返すようにしたいからです。最後のメンバーのデータ?もしそうなら、それは次のようになります:

int secondlargest(struct node* a) { 
    if(a == NULL) return -1; 
    secondlargestr(a); 
} 

int secondlargestr(struct node* a) { 
    if(a->right!=NULL) return secondlargest(a->right); 
    return (a->data); 
} 
+0

を大失敗:(ありがとう!) – Ava

+0

@vartika問題はない! –

関連する問題