2012-02-21 18 views
5

Estoy trabajando en un árbol de búsqueda binaria.uso de doble puntero en lugar de puntero único

lo tanto, aquí es la estructura que se utiliza para representar el nodo:

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

Para insertar un nodo en el árbol Tengo el siguiente método signatire

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

En el método anterior, ¿por qué requiere doble puntero. ¡Podemos usar un solo puntero!

¿Estamos usando doble puntero para evitar la duplicación?

+0

suena sospechosamente como tarea ... – Nick

+0

@ Nick lo es, pero la pregunta es válida. – Andrey

+0

Lo etiquetaré como tal y luego – Nick

Respuesta

7

No, esto es necesario en caso de reequilibrio. Después de reequilibrar la raíz podría cambiarse.

Ok, ampliaré. El puntero doble le permite modificar el puntero. Entonces, ¿qué es la raíz del árbol en su caso? Puntero al TREENODE. Algunas operaciones como la búsqueda nunca lo modificarán. Pero algunas operaciones pueden necesitar cambiarlo, para que otro nodo se convierta en una nueva raíz. Entonces tienen que tener acceso a esa variable que usa como raíz. Un ejemplo de por qué podrían necesitarlo es el reequilibrio, consulte AVL trees.

+2

esto. Cuando utilice un puntero, el nodo raíz siempre apuntará al nodo que ha dado como argumento. pero cuando por algún equilibrio, el nodo raíz cambia, su puntero a la raíz necesita cambiar también. Es por eso que necesita un puntero a un puntero. (root no es solo una variable de entrada aquí, sino una salida también vairable) – Hayt

+1

@Hayt Andrey lo tengo ... thxxx ... u people r genius ... – Anirudha

+0

No es necesariamente "rebalanceo". ¿Quién dijo que hay reequilibrio implementado allí? Podría ser el mero hecho de que la primera inserción en un árbol vacío cambiará la raíz del puntero nulo a un puntero no nulo. – AnT

2

Si tenemos necesitamos puntero doble, entonces tenemos que modificar el puntero al que apunta.

0

Es muy, depende de cómo se usa el árbol. si el árbol debe mantener algún tipo de clasificación, la inserción puede cambiar el nodo raíz, por lo que necesita doble puntero.

+0

yeah..its un árbol clasificado ... – Anirudha

2

No, está utilizando un punto doble para que pueda modificar un puntero.

0

El uso de "Punteros dobles" le permite cambiar el contenido de la memoria que <some_class>* tiene la dirección de. Por lo tanto, estamos básicamente preservando el estado de la ubicación de la memoria incluso fuera de la llamada de función. Otro uso es como para, p. char* (como cadena), y char** (como array de cadenas)

Usted puede encontrar mi respuesta en otro hilo: Why use double pointer? or Why use pointers to pointers?

Cuestiones relacionadas