максимальная функция c высота дерева - PullRequest
3 голосов
/ 16 февраля 2011

есть ли макс функция в с, так что я могу сделать что-то вроде этого, чтобы вычислить высоту дерева : или, возможно, есть лучший способ вычислить высоту дерева.

int height(struct node *tree)
{ 
    if (tree == NULL) return 0;
    return 1 + max(height (tree->left), height (tree->right)); 
}

Если да, что мне нужно?

В настоящее время я получаю эту ошибку:

dict-tree.o: в функции 'height':
/home/ex10/dict-tree.c:36: неопределенная ссылка на `max '

Ответы [ 5 ]

7 голосов
/ 16 февраля 2011

Нет, встроенного нет. Обычно вы пишете собственную встроенную функцию, например,

static inline int max(int a, int b)
{
    return (a > b) ? a : b;
}

(с использованием любого «встроенного» синтаксиса подсказок, который предпочитает ваш компилятор). В вашем случае, однако, вы могли бы просто объяснить это вручную - это достаточно просто:

int height(struct node *tree)
{ 
    int height_left, height_right;
    if (tree == NULL) return 0;

    height_left = height (tree->left);
    heigth_right = height (tree->right);

    return 1 + ((height_left > height_right) ? height_left : height_right);
}

N.B. остерегайтесь макросъемки макроса. Заманчиво сделать что-то вроде

#define MAX(a,b) (((a) > (b)) ? (a) : (b))

, который затем можно использовать для любых входных данных независимо от их типов, но проблема здесь заключается в том, что любое из входных выражений имеет побочные эффекты, например MAX(++i, ++j). Тогда проблема заключается в том, что побочные эффекты будут оцениваться дважды, независимо от того, какое из значений является максимальным. Если вы собираетесь кодировать максимум, вы должны использовать (встроенную) функцию, а не макрос. К сожалению, поскольку вы находитесь на C, а не на C ++ без перегрузки / шаблонов, это ограничит вас одним набором типов ввода / вывода для каждой названной функции max.

2 голосов
/ 16 февраля 2011

Нет, нет.Существует семейство функций для вычисления максимума значений с плавающей точкой (см. <a href="http://linux.die.net/man/3/fmax" rel="nofollow">fmax</a>() и друзья), которые вы, безусловно, могли бы использовать самостоятельно, но я думаю, что проще сделать это локально.:

const size_t left = height (tree->left);
const size_T right = height (tree->right);
return left > right ? left : right;
2 голосов
/ 16 февраля 2011

Возможно, поскольку max - неопределенная функция,

, прежде чем продолжить, попробуйте реализовать max в первую очередь.

int max(int a, int b) {
    if(a > b) return a;
    else return b;
}
0 голосов
/ 05 мая 2015
int height(struct node *tree)
{ 
if (tree == NULL) 
{
    return 0;
}    
int left = height(tree->left);
int right = height(tree->right);
return (1 + ((left >right)?left:right)); 
}

// если еще лучше, чем функция max в этом случае

0 голосов
/ 16 февраля 2011

Если вы хотите использовать C ++, а не просто C, это так. Он находится в стандартной библиотеке шаблонов, поэтому вам нужно будет включить необходимый файл. Смотрите здесь для примера:

http://www.cplusplus.com/reference/algorithm/max/

Воспроизведено для вашего удобства:

// max example
#include <iostream>
#include <algorithm>
using namespace std;

int main () {
  cout << "max(1,2)==" << max(1,2) << endl;
  cout << "max(2,1)==" << max(2,1) << endl;
  cout << "max('a','z')==" << max('a','z') << endl;
  cout << "max(3.14,2.72)==" << max(3.14,2.72) << endl;
  return 0;
}
...