Intersezione di 2 alberi binari di ricerca

voti
1

Ehi, Quindi voglio creare una nuova struttura che è fondamentalmente l'intersezione (definizione matematica di intersezione) di 2 date alberi binari di ricerca. Ho un metodo che stampa tutti i nodi in un determinato livello della struttura e ho un metodo che può scoprire la profondità delle tree.I sto incollando il mio lavoro fino ad ora anche se è incompleta e mi sono bloccato con la logic.Help sarà apprezzato.

    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);
          }
}
È pubblicato 20/04/2011 alle 11:22
fonte dall'utente
In altre lingue...                            


4 risposte

voti
0

L'intersezione di due alberi è presumibilmente i nodi che sono entrambi gli alberi?

Dato che dovrete esplorare l'albero per fare questo, perché non basta fare un attraversamento in ordine, memorizzare i nodi e poi fare un'operazione di intersezione su liste ordinate?

Risposto il 20/04/2011 a 11:33
fonte dall'utente

voti
3

Bisogna attraversamento entrambi gli alberi in modo allo stesso tempo e "in sincronia".

Io suggerirei per implementare l'interfaccia Iterable per la classe. Quindi si ottiene i primi valori da entrambi gli alberi. Se sono uguali, metterlo nel nuovo albero, e ottenere i valori prossimi da entrambi iteratori. In caso contrario, scorrere l'iteratore con i valori più piccoli fino a quando il valore che si ottiene è almeno altrettanto grande come l'ultimo valore dall'altro iteratore. Risciacqua e ripeti.

Risposto il 20/04/2011 a 12:19
fonte dall'utente

voti
0

Il mio suggerimento per un tale incrocio è semplice:

Dato albero Un albero e B, per trovare l'albero C = A \ B si intersecano:

1: copia o albero di A o B. Supponiamo A per chiarezza.
Questa copia è ora il vostro albero di C. Ora andiamo 'Trim' esso.
2: Per c = C.root_node e b = B.root_node:
se b == c,
Ripetere la procedura con nodi b.left, c.left
Ripetere la procedura con nodi b.right, c.right
altro,
Rimuovi c ( eliminando tutti i figli successivi, è implicito che sono diseguali)

Se questa implementazione avrebbe funzionato, sarebbe evitare l'uso di iteratori e simili, e si riducono ad un semplice attraversamento ricorsivo. ( Ti piace questa! )

Chiedi se si desidera ulteriori chiarimenti.

Saluti.

Risposto il 20/04/2011 a 22:38
fonte dall'utente

voti
0

Per l'attuazione ricorsiva di trovare intersezione di due alberi binari di ricerca, mi si avvicinò con il seguente codice. Io non sono molto sicuro della complessità temporale, ma funziona bene.

invalidare BST :: findIntersection (cellule * ROOT1, cellule * 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);
}

}

Risposto il 17/09/2012 a 14:58
fonte dall'utente

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