2016-06-21 10 views
2

値ノードの親を返す関数を作成しようとしています。createAB関数は機能しますが、バイナリツリー要素を繰り返し処理することはわかりません。再帰呼び出しを行う方法?。私を助けてください。バイナリツリー、ノードの親を返す

ifstream f("store.txt");//store.txt:10 7 8 0 0 0 13 9 0 11 0 0 12 0 0 
    struct elem { 
     int inf; 
     elem* st; 
     elem* dr; 
    }; 
    //this function create the binary tree 
    void createAB(elem*& p) { 
     int n; 
     f >> n; 
     if (n!=0) { 
      p = new elem; 
      p->inf = n; 
      createAB(p->st); 
      createAB(p->dr); 
     } 
     else 
      p = NULL; 
    } 
    ` 

     elem* parent(elem* rad, int n) {//my function,doesn't work 
     if (rad == NULL) 
      return NULL; 
     else 
      if (rad->st->inf == n || rad->dr->inf == n) 
       return rad;//return the element 
      else { 
       return parent(rad->st, n);//here is a problem 
       return parent(rad->dr, n); 
      } 
    } 
     10 
    7  13 
8  9 12 
      11 
node 12 => parent 13 
node 8 => parent 7 

答えて

0

sebi519から指摘されているように、rad->strad->drNULLでないことを確認する必要があります。

しかし、ここでの主な問題点は、リターンステートメントにあります。問題は、関数から最初の行がすでに返っているため、2行目が実行されないことです。

elem* parent(elem* rad, int n) { 
    if (rad == NULL) 
    return NULL; 
    else 
    if ((rad->st!=NULL && rad->st->inf == n) || (rad->dr!=NULL) && (rad->dr->inf == n)){ 
     return rad;//return the element 
    } 
    else { 
     elem* result= parent(rad->st, n); 
     if (result!=NULL){ 
     return result; 
     } 
     else{ 
     return parent(rad->dr, n); 
     } 
    } 
} 
+0

は端末ノードでは機能しません – paulc

+0

@paulc私は完全な機能を追加しました。少なくともそれは私のために働く。 –

+0

ありがとう!!!再帰なしでこの関数を書くにはどうすればいいですか? – paulc

0

rad->strad->drrad->st->infrad->dr->infを使用する前にnullの場合は、チェックする必要があります。

+0

ドン:

elem* result = parent(rad->st,n); if (result != NULL) return result; else return parent(rad->dr,n); 

フル機能を修正:それは成功したし、その後2回目の呼び出しをしない場合場合

return parent(rad->st, n);//This returns and the next line is not executed return parent(rad->dr, n); 

あなたが最初の呼び出しの結果を保存してチェックする必要があります問題が何であるか分かりません – paulc

関連する問題