использование двойного указателя вместо единственного указателя - PullRequest
5 голосов
/ 21 февраля 2012

Я работаю над бинарным деревом поиска.

Итак, вот структура, используемая для представления узла:

typedef struct TreeNode
{
int num;
struct TreeNode *left,*right;
}TREENODE;

Чтобы вставить узел в дерево, у меня есть следующий метод подписи

void InsertNode(TREENODE **root,int data);

В вышеприведенном методе зачем нам нужен двойной указатель. Мы можем использовать один указатель!

Используем ли мы двойной указатель, чтобы избежать дублирования?

Ответы [ 5 ]

7 голосов
/ 21 февраля 2012

Нет, это необходимо в случае восстановления баланса.После изменения баланса root можно изменить.

Хорошо, я буду расширяться.Двойной указатель позволяет изменять указатель.Так что же такое корень дерева в вашем случае?Указатель на TREENODE.Некоторые операции, такие как поиск, никогда не изменят его.Но некоторые операции могут изменить его, чтобы другой узел стал новым корнем.Поэтому они должны иметь доступ к той переменной, которую вы используете как root.Один из примеров, почему им может понадобиться это восстановление баланса, см. деревья AVL .

2 голосов
/ 21 февраля 2012

Нет - вы используете двойную точку, чтобы вы могли изменить указатель.

2 голосов
/ 21 февраля 2012

Если нам нужен двойной указатель, то нам нужно изменить указатель, на который он указывает.

0 голосов
/ 29 июня 2013

Использование «двойных указателей» позволяет вам изменять содержимое памяти, адрес которой <some_class>* содержит. Итак, мы в основном сохраняем состояние ячейки памяти даже вне вызова функции. Другое использование, например, , например char* (как String ) и char** (как Array of String )

Вы можете найти мой ответ в другой теме: Зачем использовать двойной указатель? или зачем использовать указатели на указатели?

0 голосов
/ 21 февраля 2012

Это очень зависит от того, как вы используете дерево. если дерево должно продолжать сортировку, то вставка может изменить корневой узел, поэтому вам нужен двойной указатель.

...