Как избежать повторения с лево-правыми дочерними элементами дерева в C++

Я хотел избежать повторения моего if-else дважды (один раз для левого, один раз для правого, одинаково), поэтому я сделал это, что выглядит очень недиоматично:

MovieNode** child = title < parent->title ? &parent->left : &parent->right;
if(*child)
    parent = *child;
else
    *child = new MovieNode(ranking, title, releaseYear, quantity);

Какой правильный способ сделать это?

[кстати, именно поэтому я предпочитаю Haskell XD, я бы просто сделал parent = child]

1 ответ

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

Обычно я пишу такой алгоритм так:

// start from your root node, parent must not be NULL
MovieNode ** current = &parent;

// find an appropriate empty leaf
while (*(current = (title < (*current)->title ? &(*current)->left : &(*current)->right)));

// assign to the empty leaf
(*current) = new MovieNode(ranking, title, releaseYear, quantity);

РЕДАКТИРОВАТЬ: Незначительное, но важное обновление цикла while(), сделанное после того, как я действительно проверил и доказал это в реальной программе. Хорошо идти сейчас.

Другие вопросы по тегам