/ / Implementazione di alberi binari C ++ - c ++, funzione, albero, inserto, albero binario

Implementazione di alberi binari C ++ - c ++, funzione, albero, inserto, albero binario

Ho cercato di implementare un albero di ricerca binario in C ++ per divertimento il problema è che sto avendo problemi con la mia funzione di inserimento. Di seguito è quello che ho finora:

class TreeNode{

public:
int data;
TreeNode *left;
TreeNode *right;
void Insert(int value, TreeNode *x);
void TreeNode::Print(TreeNode *x);
TreeNode();
};


TreeNode::TreeNode(){

left = NULL;
right = NULL;

}

.

void TreeNode::Insert(int value, TreeNode *x){

if(x->left == NULL && x->right == NULL){
TreeNode *tree = new TreeNode();
tree->datavalue;
x->left = tree;
}

else if(x->left == NULL && x->right != NULL){

TreeNode *tree = new TreeNode();
tree->data = value;
x->left = tree;
}

else if(x->left != NULL && x->right == NULL){

TreeNode *tree = new TreeNode();
tree->data = value;
x->right = tree;
}

else if(x->left != NULL && x->right != NULL){

??????

}

}

risposte:

5 per risposta № 1

Non dovresti inserire ciecamente, seguire la logicasotto. Se x.value è inferiore al valore di root, provare a inserire a sinistra. Se x.value è> = root.value, vai a destra. Ripeti questa logica fino a quando non premi un valore NULL. Quello sarà il posto giusto per inserire il tuo elemento.

Potresti capovolgere la logica, ho appena scelto left on <perché meno che kinda fa una freccia a sinistra. <-: P

TreeNode *root = this;
TreeNode *parent = root;
//Traverse the tree, go left if x.val < , else go right(>=)
while(root) {
parent = root;
root = (root->value > x.value) ? root->left : root->right;
}
if(parent->value > x->value)
parent->left = x;
else
parent->right = x;

Se non ti interessa ordinare, fai una prima ricerca approfondita con una coda.

queue<TreeNode*> nodes;
nodes.push(this);
while(1)
{
if(!nodes.front()->left)
{
nodes.front()->left = x;
return;
}
else if (!nodes.front()->right)
{
nodes.front()->right = x;
return;
}
nodes.push(nodes.front()->left);
nodes.push(nodes.front()->right);
nodes.pop();
}

1 per risposta № 2

Se si desidera inserire sia a sinistra che a destrai bambini NON sono nulli, quindi puoi inserire l'oggetto spostandoli ricorsivamente sul nodo più a sinistra dell'albero. E dal momento che stai semplicemente inserendo valori senza un ordine particolare, sarà difficile tenere traccia. Piuttosto implementare un albero di ricerca binaria in quel caso.

else if(x->left != NULL && x->right != NULL){
Insert(value,x->left);
x-> data  = value;
x->left = x->right = NULL;
}

E, soprattutto, inserire un caso BASE per uscire dalla ricorsione.