Alex Allain'in C++ içine atlamak bana yinelenen bir ikili arama ağacını silme konusunda inanılmaz bir görev verdi (Bölüm 17). Yapım tanımımı değiştirerek bu görevi basitleştirmenin bir yolunu buldum. Böylece, sadece sol ve sağ işaretçiler yerine ana düğümüne bir işaretçi eklenmiştir. Bir yığın/bağlantılı liste veri yapısı kullanmaktan kaçınmaya çalışıyorum. Bu başarmak içinYinelenen bir ikili ağaç silme ile ilgili sorun
Benim algoritmadır:
- denetleme geçerli düğümün L ve R işaretçileri hem NULL
- ise böylece düğüm silip ana düğüme gidin. 1. adım elde edilene kadar, L ve R düğümlerine gitmek Değilse
- biz BOŞ ebeveyn düğüm (kök düğüm en hit ettik zaman
- Benim algoritması sonucuna (sol L/R işaretçileri hem işgal birinci eğer gider) üst = NULL)
Sorun şu ki, sonsuz bir döngüde takılıyorum. Benim insert() işlevimin bozuk olduğundan şüpheliyim, ama yanılıyor olabilirim.
struct node
{
int key_value;
node *p_left;
node *p_right;
node *parent;
};
node* insert (node *p_tree, int key, node* parent)
{
if (p_tree == NULL)
{
node* p_new_tree = new node;
p_new_tree->p_left = NULL;
p_new_tree->p_right = NULL;
p_new_tree->key_value = key;
p_new_tree->parent = parent;
return p_new_tree;
}
else if(key < p_tree->key_value)
p_tree->p_left = insert(p_tree->p_left, key, p_tree);
else
p_tree->p_right = insert(p_tree->p_right, key, p_tree);
return p_tree;
}
void destroy_tree_Iteratively(node* p_tree)
{
int nodesDestroyed = 0; //checking to see if I delete the right amount
while (p_tree != NULL)
{
if (p_tree->p_left == NULL && p_tree->p_right == NULL)
{
node* placeHolder = p_tree->parent;
delete p_tree;
p_tree = placeHolder;
}
else if (p_tree->p_left != NULL)
p_tree = p_tree->p_left;
else if (p_tree->p_right != NULL)
p_tree = p_tree->p_right;
}
cout << "You've deleted " << nodesDestroyed << " nodes!" << endl;
}
Hangi düğümlerin eklendiğini yazdırdım ve iyi görünüyordu – 54skyxenon
@downvoter Lütfen açıklayın. – EJP