2017-05-14 3 views
0

바이너리 검색 트리에서 가장 큰 리프에있는 모든 노드를 합산하려고합니다. 노드에는 양수 만 포함됩니다.BST에서 가장 큰 리프까지가는 요소의 합계

#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 
#include <time.h> 

typedef int ElType; 

typedef struct Tree { 
    ElType key; 
    struct Tree *left; 
    struct Tree *right; 
} Tree; 

Tree* InsertBST(Tree* t, int k) 
{ 
    if (t == NULL) { 
     Tree* w = (Tree*) malloc(sizeof(Tree)); 
     w->key = k; 
     w->left = NULL; 
     w->right = NULL; 
     return w; 
    } 

    if (k <= t->key) 
     t->left = InsertBST(t->left, k); 
    else 
     t->right = InsertBST(t->right, k); 

    return t; 
} 

int SumMaxOfBST(Tree* t, int *sum_max) 
{ 
    if (t == NULL) { 
     *sum_max = -1; 
     return *sum_max; 
    } 

    if (t->right == NULL) { 
     *sum_max += t->key; 
     return *sum_max; 
    } 

    *sum_max += t->key; 

    *sum_max += SumMaxOfBST(t->right, sum_max); 
    return *sum_max; 
} 

int main() 
{ 
    int i; 
    srand (time(NULL)); 

    Tree* t = NULL; 
    for (i = 0; i < 20; i++) 
     t = InsertBST(t, rand() % 1000); 

    int sum_way = 0; 
    int a = SumMaxOfBST(t, sum_way); 

     printf("Sum on the way to the largest leaf %d:\n", a); 

    return 0; 
} 

이 상태는 0이 아닌 상태로 종료됩니다. 내 강한 의혹은 포인터의 사용을 망쳤다는 것입니다. 그러나 포인터를 사용하여 여러 번 다시 쓰고 비디오를 작성한 후에도 여전히 어떤 일이 일어나고 있는지 파악하지 못하고 있습니다. 올바르게 이해하면 *sum_max += xsum_max의 값을 x까지 증가시켜야합니다. 어떤 시점에서 포인터를 사용합니까?

+1

컴파일러는'int a = SumMaxOfBST (t, sum_way); '호출에서'sum_way' 앞에'&'가 없다는 것에 대해 불평해야합니다. 컴파일러 경고에주의를 기울이십시오. 컴파일러가 맞고 적어도 C 코딩 경력의이 단계에서 여러분이 틀렸을 것입니다. –

+0

또한,''는'malloc()'을 선언합니다. 헤더의 확장 기능을 사용하지 않는 한 ''을 포함 할 필요가 없습니다. 또한 귀하의 코드는 귀하가 얻은 답이 맞는지 여부를 확인할 방법이 없습니다. 트리를 인쇄하지 않으므로 계산이 올바른지 알 수 없습니다. –

답변

2

SumMaxOfBST에 대한 매개 변수로 int에 대한 포인터를 가져 오는 이유는 알지 못합니다.이 함수는 더 간단합니다. SumMaxOfBSTint*을 기대하면서 main

또한
int SumMaxOfBST(Tree* t) 
{ 
    if (t == NULL) { 
     return 0; 
    } 
    if (t->right == NULL) { 
     return t->key; 
    } 
    return t->+key + SumMaxOfBST(t->right); 
} 

, 당신은 int입니다 sum_way을 전달하고 있습니다. 대신 &sum_way을 전달해야합니다.

+0

고마워, 이건 내 시도보다 훨씬 깨끗해. – Zelazny

관련 문제