Я пытаюсь удалить левый дочерний элемент (10) из примера дерева двоичного поиска, используя два метода:
- Метод 1: путем передачи указателя на указатель на текущий узел.
- Метод 2: Передавая адрес указателя на текущий узел.Это не удаляет узел, но вызов delete разрушает расположение указателей, вызывая сбой при печати узлов.
Дерево выглядит следующим образом, и я пытаюсь удалить 10 и заменить его на 5
20
|
10--|---30
|
5---|
Я немного разбираюсь в указателях.Но, тем не менее, мне не совсем понятно с таким поведением указателей.
#include <iostream>
class Node
{
public:
Node(int key) : leftChild(0), rightChild(0), m_key (key){}
~Node(){}
Node *leftChild;
Node *rightChild;
int m_key;
};
Node* build1234(int, int, int, int);
void print(Node *);
void print1234(Node *);
void removeLeft(Node **nodePtr)
{
Node *oldPtr = *nodePtr;
if(*nodePtr)
{
*nodePtr = (*nodePtr)->leftChild;
delete oldPtr;
}
}
int main()
{
Node *demo1 = build1234(10, 20, 30, 5);
Node *demo2 = build1234(10, 20, 30, 5);
print1234(demo1);
print1234(demo2);
//Method1 - 10 is correctly removed with 5
Node **nodePtr = &demo1;
nodePtr = &(*nodePtr)->leftChild;
removeLeft(nodePtr);
print1234(demo1);
//Method2 - 10 is not removed
Node *node = demo2;
node = node->leftChild;
removeLeft(&node);
print1234(demo2);
return 0;
}
Node* build1234(int B, int A, int C, int D)
{
Node *root = new Node(A);
root->leftChild = new Node(B);
root->rightChild = new Node(C);
root->leftChild->leftChild = new Node(D);
return root;
}
void print(Node *node)
{
if(node)
{
print(node->leftChild);
std::cout << "[" << node->m_key << "]";
print(node->rightChild);
}
}
void print1234(Node *node)
{
std::cout << std::endl;
print(node);
}
Примечание: Этот вопрос касается не BST, а указателей.Если вы видите два вызова removeLeft(nodePtr)
и removeLeft(&node)
в функции main()
.
- Чем они отличаются?
- Почему второму способу не удается достичь желаемого результата?