Intersección de 2 árboles binarios de búsqueda

votos
1

Oye, quiero crear un nuevo árbol que es básicamente la intersección (definición matemática de intersección) de 2 árboles binarios de búsqueda dados. Tengo un método que imprime todos los nodos en un nivel particular del árbol y tengo un método que se puede averiguar la profundidad de las tree.I estoy pegando mi trabajo hasta ahora, aunque es incompleta y tengo que cargar con el logic.Help será apreciada.

    public static Bst<Customer> intersect (Bst<Customer> a, Bst<Customer> b){
    Bst<Customer> result = new Bst<Customer>();
    BTNode<Customer> cur1;
    BTNode<Customer> cur2;
    BTNode<Customer> cur3;
    cur1=a.root;
    cur2=b.root;
    cur3=result.root;
    int Resultdepth;
    if(a.maxDepth()<b.maxDepth())
        Resultdepth=a.maxDepth();
    else
        Resultdepth=b.maxDepth();

    if(cur1==null || cur2==null){ // Handeling the root case intially
        result = null;
    }
    else 
      cur3.item.set_account_id(cur1.item.get_accountid()+ cur2.item.get_accountid());

    cur1=cur1.left;
    cur2=cur2.left;
    cur3=cur3.left;       

    while(<some check>){

    }


    return result;

}


    public int maxDepth(){
        return mD(root);
    }

    int mD(BTNode<E> node){
       if (node==null) {
            return(0);
        }
       else {
            int lDepth = mD(node.left);
            int rDepth = mD(node.right);
            // use the larger + 1
            return(Math.max(lDepth, rDepth) + 1);
        }
    }

     // for printing the nodes at a particular level and giving the starting level
      public void PrintAt(BTNode<E> cur, int level, int desiredLevel) {
         if (cur == null) {
            return;
        }
         if (level == desiredLevel) {
             System.out.print(cur.item.toString() + );
          }
         else {
             PrintAt(cur.left, level+1, desiredLevel);
             PrintAt(cur.right, level+1, desiredLevel);
          }
}
Publicado el 20/04/2011 a las 11:22
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
0

La intersección de dos árboles es, presumiblemente, los nodos que se encuentran en ambos árboles?

Teniendo en cuenta que tendrás que explorar el árbol para hacer esto, ¿por qué no hacer un recorrido en orden, almacenar los nodos y luego hacer una operación de intersección de las listas ordenadas?

Respondida el 20/04/2011 a las 11:33
fuente por usuario

votos
3

Tienes que ambos árboles de recorrido con el fin al mismo tiempo y "sincronizado".

Yo sugeriría que implementar la interfaz Iterable para su clase. Entonces usted consigue los primeros valores de los dos árboles. Si son iguales, lo puso en el nuevo árbol, y obtener los siguientes valores de los dos iteradores. Si no es así, repetir el iterador con los valores más pequeños hasta que el valor que se obtiene es como mínimo tan grande como el último valor del otro iterador. Enjuague y repita.

Respondida el 20/04/2011 a las 12:19
fuente por usuario

votos
0

Mi sugerencia para dicha intersección es simple:

Dada árbol A y B del árbol, para encontrar el árbol C = A \ B se cruzan:

1: Copiar o bien el árbol A o B. Supongamos A para mayor claridad.
Esta copia es ahora su árbol C. Ahora vamos a 'recortar' la misma.
2: Para c = C.root_node y b = B.root_node:
si b == c,
Repetir el procedimiento con nodos b.left, c.left
Repetir el procedimiento con nodos b.right, c.right
otra cosa,
Eliminar c ( eliminando de este modo todos los niños posteriores, se da a entender que son desiguales)

Si esta implementación funcionaría, sería evitar el uso de iteradores y similares, y se reducen a un simple recorrido recursivo. ( Como no! )

Pregunte si desea más aclaraciones.

Saludos.

Respondida el 20/04/2011 a las 22:38
fuente por usuario

votos
0

Para la aplicación recursiva de la búsqueda de intersección de dos árboles binarios de búsqueda, me encontré con el siguiente código. No estoy muy seguro de la complejidad del tiempo, pero funciona bien.

anulará BST :: findIntersection (celular * root1, celular * root2) {

if(root1 == NULL ) { 
//  cout<<"Tree 1 node is null , returning"<<endl;  
    return;
}
if(root2 == NULL) {
//  cout<<"Tree 2 node is null , returning"<<endl;  
    return;
}
//cout<<"Comparing tree 1 : "<<root1->data<< "   and tree 2 : " << root2->data<<endl;
if(root1->data==root2->data) {
//  cout<<"tree 1 equal to tree 2 "<<endl;
    insert(root1->data);
//  cout<<"Inserting in new tree : "<<root1->data<<endl;
    findIntersection(root1->left,root2->left);
    findIntersection(root1->right, root2->right);
}
else if(root1->data>root2->data) {
//  cout<<"tree 1 > tree 2 "<<endl;
    findIntersection(root1,root2->right);
    findIntersection(root1->left, root2);
}
else  {
//  cout<<"tree 1 < tree 2 "<<endl;
    findIntersection(root1->right,root2);
    findIntersection(root1, root2->left);
}

}

Respondida el 17/09/2012 a las 14:58
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more