Я пытаюсь создать функцию добавления, которая будет полностью обрабатывать все узлы для обхода предварительного заказа.Я могу добраться до нужного места в дереве, чтобы добавить новый узел, и именно здесь я не могу точно перемещать указатели.Мне дали функцию, которая выполняет обход предзаказа для дерева с предзаказом.
Любая помощь, указатели или идеи будут с благодарностью.Большое спасибо!
q - родитель узла, который я добавляю
p - узел, который я добавляю
parentq - родитель родительского элемента q
p-> leftThread = true;p-> rightThread = true;
if (left)
{
if (parentq->rightChild)
{
p->leftChild = static_cast<threadBinNode<BaseData>*>(q);
p->rightChild = static_cast<threadBinNode<BaseData>*> (q->rightChild);
q->leftChild = static_cast<threadBinNode<BaseData>*>(p);
q->leftThread = false;
}
else
{
p->leftChild = static_cast<threadBinNode<BaseData>*>(q);
p->rightChild = BinThreadTree<BaseData>::root;
q->leftChild = static_cast<threadBinNode<BaseData>*>(p);
q->leftThread = false;
}
}
else
{
if (parentq->rightChild)
{
p->rightChild = static_cast<threadBinNode<BaseData>*>(parentq->rightChild);
p->leftChild = static_cast<threadBinNode<BaseData>*>(q);
q->rightChild = static_cast<threadBinNode<BaseData>*>(p);
q->rightThread = false;
}
else
{
p->rightChild = BinThreadTree<BaseData>::root;
p->leftChild = BinThreadTree<BaseData>::root;
}
}
Это функция обхода, которую мне дали:
template <class BaseData>
void BinThreadTree<BaseData>::preorder(void (*processNode)(BaseData &item))
{
threadBinNode<BaseData> *p;
p = static_cast< threadBinNode<BaseData>* >
( BinThreadTree<BaseData>::root -> leftChild ) ;
do
{
if ( p != BinThreadTree<BaseData>::root )
processNode( p->info );
if (!p -> leftThread )
p = static_cast< threadBinNode<BaseData>* >(p -> leftChild);
else
p = static_cast< threadBinNode<BaseData>* >(p->rightChild);
}
while (p != BinThreadTree<BaseData>::root );
}