В следующем коде для бинарного дерева поиска:
template <class TKey>
class bst<TKey>::node *bst<TKey>::insert(node *T, TKey &key)
{
if (T == NULL) {
T = new node;
T->key = key;
} else if (T->key == key) {
cout << "key " << key << " already in tree" << endl;
} else {
int dir = T->key < key;
T->link[dir] = insert(T->link[dir], key);
}
return T;
}
Я запутался, что за линия
int dir = T->key < key;
делается. Я мог понять «int dir = T-> key», хотя, конечно, это не имело бы смысла, но я не видел «<оператор использовал таким образом раньше. Любые подсказки?
T->key < key
это условие. Это будет оценивать либо true
или же false
,
Если это оценивает true
, dir
получит значение 1
иначе получит значение 0
,
int dir = T->key < key;
это короткая форма для письма
int dir;
if(T->key < key)
dir = 1;
else
dir = 0;
Когда boolean
назначен на int
, он получает значение 0
или же 1
соответствует false
или же true
,
Если оператор не перегружен, то он имеет обычное значение; это оценивает либо true
или же false
, Это bool
тип, и, следовательно, может быть неявно преобразован в int
,
Однако если TKey
является классом и перегружает его, или есть глобальная перегрузка, тогда мы понятия не имеем, что он делает, пока не увидим код.
<
возвращает 1, если первый операнд меньше второго операнда, или 0 в противном случае.
<
operator — логический оператор сравнения, т. е. он оценивает 0
если условие ложно, и 1
если условие верно. Обычно он используется в условных выражениях, но прямое использование возвращаемого значения вполне допустимо. В этом случае, если значение T->key
меньше, чем значение key
, dir
будет 1
иначе dir
будет 0
,
Итак, поскольку дерево бинарного поиска хранит значения, меньшие, чем root, слева и большие значения справа, вам нужно выбрать, в каком направлении будет происходить вставка. Для этого вы сравниваете ключ со значением текущего узла. Результат этого сравнения сохраняется в переменной dir. Таким образом, если ключ меньше значения T, dir получает 1, который представляет левую сторону в ссылке [], которая содержит указатели на левую и правую ветви узла T. И затем вставка выполняется рекурсивно с левым узлом T. почему вы делаете сравнение там. Просто чтобы увидеть, нужно ли вставлять элемент справа или слева от текущего узла.