2017-07-28 9 views
0

バイナリツリーのノードのルートからの距離を求めなければなりません。 私の解決策は次のとおりです。ルートからバイナリツリーのノードまでの距離

int distanceUtil(struct node* root, int x, int dist) { 
    if (root == NULL) { 
     return -1; 
    } 
    else { 
     if (root->data == x) { 
      return dist; 
     } 
     return distanceUtil(root->left, x, dist + 1) || distanceUtil(root->right, x, dist + 1); 
    } 
} 

int distance(struct node* root, int x) { 
    return distanceUtil(root, x, 0); 
} 

が、メインに私が行うとき、それはwork.In事実をしていません。

struct node* root = newNode(12); 
root->left = newNode(8); 
root->right = newNode(18); 
root->left->left = newNode(2); 
root->left->right = newNode(9); 
root->right->left = newNode(15); 
root->right->right = newNode(22); 
root->right->right->right = newNode(33); 
printf("il cammino : %d", distance(root,33)); 
getchar(); 
return 0; 

それは1を返しますが、誰かが私を助けることができるそれが3を返す必要がありますか? ありがとうございます。

+0

'' ||のみのいずれかを返す0または1 https://stackoverflow.com/a/18098119/3072566 – litelite

答えて

0

論理OR演算子||を使用して、左ツリーと右ツリーの検索結果を結合しています。演算子の結果は常に0または1なので、それ以外の結果は得られません。

あなたが本当に望むのは、各サブツリー検索の2つの値のうち大きい方を返すことです。だから、それぞれの側面を検索した結果を保存して、どれが大きいかを確認してそれを返します。

int distanceUtil(struct node* root, int x, int dist) { 
    if (root == NULL) { 
     return -1; 
    } 
    if (root->data == x) { 
     return dist; 
    } 

    int left = distanceUtil(root->left, x, dist + 1); 
    int right = distanceUtil(root->right, x, dist + 1); 
    if (left > right) { 
     return left; 
    } else { 
     return right; 
    } 
} 
+0

は、それぞれの側の結果を追加しますか?彼はすべてのノードを数えたくありません! – Klaus

+0

@Klaus何も見つからない場合に0が返された場合に機能します。ただし、これは、ターゲット値がルートノードにある場合と同じ結果を返します。私は2つを区別する別の方法で更新しました。 – dbush

関連する問題