2016-12-14 17 views
2

私は初心者でCバイナリ検索ツリーで作業しています。ツリーの葉の数を返すメソッドを実行しようとしています。親)子(左/右)HERESに私のツリー構造体がありません:それは、このように作成されCのバイナリ検索ツリーの葉の数

struct Node { 
    int value; 
    struct Node *left; 
    struct Node *right; 
}; 

typedef struct Node TNode; 
typedef struct Node *binary_tree; 

binary_tree NewBinaryTree(int value_root) { 
    binary_tree newRoot = malloc(sizeof(TNode)); 
    if (newRoot) { 
     newRoot->value = value_root; 
     newRoot->left = NULL; 
     newRoot->right = NULL; 
    } 
    return newRoot; 
} 

私が好きそれに要素を追加します。

void Insert(binary_tree *tree, int val) { 
    if (*tree == NULL) { 
     *tree = (binary_tree)malloc(sizeof(TNode)); 
     (*tree)->value = val; 
     (*tree)->left = NULL; 
     (*tree)->right = NULL; 
    } else { 
     if (val < (*tree)->value) { 
      Insert(&(*tree)->left, val); 
     } else { 
      Insert(&(*tree)->right, val); 
     } 
    } 
} 
を葉の数をカウントする

私の実際の方法:もちろん

int nbleaves(binary_tree tree) 
{ 
    int nb; 
    if(tree->right==NULL && tree->left ==NULL){ 
     nb=nb+1; 
    } 
    printf("%d",nb); 
} 

このdoesntの作業は最初の実際のループをtheresのは、しかし、私はそれを試してみました、それはに要素2222および3を追加した後にエラーが、0(EXを返すdoesntのツリーこの関数は0を返す)。私はこの関数を行う方法を知らない。

ありがとうございました!

+0

、 '置き換えるのprintf( "%d個"、NB);'他{場合と '(!TREE->右= NULL)NB + = nbleaves(ツリー→右)。 if(tree-> left!= NULL)nb + = nbleaves(ツリー→左); }返信nb; ' – ikegami

+0

@ikegami私はこれを試してコンパイルしましたが、そのコードでその関数を呼び出すと、プログラムがクラッシュします –

答えて

1

if(tree->right==NULL && tree->left ==NULL){ 
    nb=nb+1; 
} 

を比較しますコメントで述べた)。このアプローチは私のテストで私のために働いたので、あなたが試したときにどんなエラーが出るのか分かりません。例えば

int nbleaves(binary_tree tree) 
{ 
    int nb=0; 
    if(tree->right==NULL && tree->left ==NULL){ 
    nb=nb+1; 
    } 
    else { 
    if(tree->left!=NULL) 
     nb += nbleaves(tree->left); 
    if(tree->right!=NULL) 
     nb += nbleaves(tree->right); 
    } 
    return nb; 
} 

、このテストケースで:ある

5: 3 7 
3: 2 4 
2: 1 NULL 
1: NULL NULL 
4: NULL NULL 
7: 6 8 
6: NULL NULL 
8: NULL 9 
9: NULL NULL 
4 

最後の行は、葉がカウントされ、残り:それは、この出力を生成

int main() {  
    binary_tree root=NULL; 

    root=NewBinaryTree(5); 
    Insert(&root,3); 
    Insert(&root,7); 
    Insert(&root,2); 
    Insert(&root,8); 
    Insert(&root,6); 
    Insert(&root,1); 
    Insert(&root,4); 
    Insert(&root,9); 
    traverse(root); /*Just a function I created for testing*/ 

    printf("%d\n",nbleaves(root)); 

    free_tree(root); /*Also a function I wrote*/ 
    return 0; 
} 

ここに私のnbleaves()機能ですtraverse()の出力。

私の完全なプログラムについては

:機能の不足しているビットについてはhttps://repl.it/Epud/0

+0

ああ私は今参照してください!ありがとうたくさん@abacles –

+0

問題ありません!がんばろう! – abacles

5

nbを初期化する必要があります。 nb以来

int nb = 0; 

は、その値が非常に大きくなる可能性があるので、あなたが見る動作があるので、それは「ランダム」または「ごみ」の値を含む初期化されていないです。しかし、その価値が何かを予測する方法はありません。

:ホワイトスペースで「けち」ではいけないが、それらのあまりに多くを使用していないが、あなたのコードの息が少しみましょう。

は@iharobが指摘したように、あなただけのよう(ツリーの左半分と右半分に再帰し、あなたの合計にそれを追加する必要があり、初期化以外にも

if ((tree->right == NULL) && (tree->left == NULL)) { 
    nb = nb + 1; 
} 
+0

ありがとう、私の投稿を編集しました。ループをどのように行うかについて確かめてください。 –

+0

@ChristopherM。回答者が投稿された後には、編集しないでください!今私の答えは無効です。これはSOの仕組みではありません。 –

+0

私の悪い、私はそれを編集します。私のせいここに新しい私は –

関連する問題