Как избежать повторения с лево-правыми дочерними элементами дерева в 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(), сделанное после того, как я действительно проверил и доказал это в реальной программе. Хорошо идти сейчас.