Пытаясь найти глубину бинарного дерева - PullRequest
3 голосов
/ 04 февраля 2020

Я пытаюсь написать что-то, чтобы определить наибольшую глубину бинарного дерева, но далеко не получилось только одно, которое постоянно возвращает количество узлов в дереве, и другое, ниже, это всегда еще один или меньше. После нескольких часов попыток отрегулировать это, я мог бы действительно использовать несколько советов ..

void findthedepth(nodeoftree<node>* root, int* depthtotal, int* depthcurrent){

    int left = 0, right = 0;

    if( root == nullptr ){
        *depthtotal = 0;
        *depthcurrent = 0;
        return;
    }

    findthedepth(root->rightp(), depthtotal, depthcurrent);
    right = *depthcurrent;

    *depthcurrent = 0;

    findthedepth(root->leftp(), depthtotal, depthcurrent);
    left = *depthcurrent;


    if (left > right){ 
        *depthtotal += left + 1;
    }
    else { 
        *depthtotal += right + 1;
    }
}

Ответы [ 2 ]

5 голосов
/ 04 февраля 2020

Необходимо рассмотреть два случая:

  • Пустое дерево имеет нулевую глубину;
  • Непустое дерево имеет один уровень больше глубины двух его поддеревьев, поэтому он имеет глубину 1 + max(depth_left, depth_right).

Если мы напишем это в C ++:

int depth(nodeoftree<node>* root) {
    if (root == nullptr)
        return 0;

    int depth_left = depth(node->leftp());
    int depth_right = depth(node->rightp());
    return 1 + max(depth_left, depth_right);
}
0 голосов
/ 04 февраля 2020

Вы очень близки, вам не нужен указатель depthCurrent

   findthedepth(root->rightp(), depthtotal /*, depthcurrent*/);
   right = *depthtotal; // update the total depth captured in right

   // *depthcurrent = 0; (no use)

   findthedepth(root->leftp(), depthtotal /*, depthcurrent*/);
   left = *depthtotal; // update the total depth captured in left
...