Переполнение стека дерева Succesor AVL

Я попытался реализовать преемник дерева AVL, я не буду охватывать весь мой код, это самая важная часть (все остальные части работают на 100%). я имею class avltree, struct node с element, left, right а также parent, также у меня есть typedef struct node *nodeptr; легко.

nodeptr avltree::find(int x,nodeptr &p)
{
if (p==NULL)
{
cout<<"NOT EXISTS\n"<<endl;
return NULL;
}
else
{
if (x < p->element)
{
return find(x,p->left);
// return p;
}
else
{
if (x>p->element)
{
return find(x,p->right);
// return p;
}
else
{
// cout<<"EXISTS\n"<<endl;
return p;
}
}
}
}
nodeptr avltree::succ(int x, nodeptr &p){
p=find(x, p);
if (p->right){
return findmin(p);
}
else {
while(   (p->parent)->left!=p  ){
p=p->parent;

}
return p;
}
}

И вот, как я определяю все эти вещи в основном:
int main ()

{
nodeptr root, max;
avltree bst;
root=NULL;for(int i=0; i<=5; i++){
bst.insert(i, root);
}bst.getneighbors(root);
max=bst.succ(3, root);
cout<<max->element;

return 0;
}

void avltree::getneighbors(nodeptr &p){ //get parents
while(!p->left){
nodeptr p2;
p2=p->left;
p2->parent=p;
getneighbors(p2);
}
while(!p->right){
nodeptr p2;
p2=p->right;
p2->parent=p;
getneighbors(p2);
}
}

Итак, я реализовал функцию getParents. Но ничего не работает, например succ (3) в compute 0. Не могли бы вы помочь мне разобраться в чем проблема. Если вам нужен дополнительный код — я его опубликую. Заранее спасибо.

1

Решение

nodeptr avltree::succ(int x, nodeptr &p){
p=find(x, p);
if (p->right){
//////////////////////////
return findmin(p->right);
//////////////////////////
}
else {
//////////////////////////
while(true){
if (p->parent == NULL)
return NULL;
if ((p->parent)->left == p)
return p->parent;
else
p=p->parent;
}
//////////////////////////
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector