Intersecția 2 arbori de căutare binare

voturi
1

Hei, Așa că vreau să creeze un nou copac, care este, în principiu intersecția (definiția matematică de intersecție) din 2 date arbori de căutare binare. Am o metodă care se imprimă toate nodurile la un anumit nivel de copac și am o metodă care se poate afla adâncimea tree.I am inserând munca mea de până acum, deși este incomplet și eu sunt blocat cu logic.Help va fi apreciat.

    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);
          }
}
Întrebat 20/04/2011 la 11:22
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
0

Intersecția a două copaci este probabil nodurile care sunt în ambele copaci?

Având în vedere că va trebui să exploreze copac pentru a face acest lucru, de ce nu doar un parcurgeri în ordine, stoca nodurile și apoi face o operație de intersecție pe liste ordonate?

Publicat 20/04/2011 la 11:33
sursa de către utilizator

voturi
3

Trebuie să traversal ambele copaci pentru, în același timp și „în sincronizare“.

Aș sugera să pună în aplicare interfața Iterable pentru clasa ta. Apoi, veți obține primele valori de la ambii copaci. Dacă acestea sunt egale, pune-l în noul copac, și a obține următoarele valori din ambele iteratori. Dacă nu, itera reluatorul cu valori mai mici, până când valoarea veți obține este cel puțin la fel de mare ca ultima valoare de celălalt iterator. Se clătește și se repetă.

Publicat 20/04/2011 la 12:19
sursa de către utilizator

voturi
0

Sugestia mea pentru o astfel de intersecție este simplu:

Având în vedere copac A și B copac, pentru a găsi copac C = A \ Intersect B:

1: Copiați fie copac A sau B. Să presupunem A pentru claritate.
Acest exemplar este acum copacul C. Acum , să „tăiați“ l.
2: Pentru c = C.root_node și b = B.root_node:
dacă b == c, Se
repetă procedura cu nodurile b.left, c.left Se
repetă procedura cu nodurile b.right, c.right
altfel,
Eliminare c ( eliminând , astfel , toți copiii ulterioare, se presupune că sunt inegale)

În cazul în care această punere în aplicare ar funcționa, ar evita utilizarea iteratorii și altele asemenea, și se fierbe până la un traversal recursiv simplu. ( Ca aceasta! )

Întrebați dacă doriți clarificări suplimentare.

Salutari.

Publicat 20/04/2011 la 22:38
sursa de către utilizator

voturi
0

Pentru punerea în aplicare recursiv de a găsi intersecția a doi copaci de căutare binare, am venit cu următorul cod. Nu sunt foarte sigur de complexitatea timp, dar nu funcționează bine.

duce la pierderea BST :: findIntersection (celula * root1, celula * 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);
}

}

Publicat 17/09/2012 la 14:58
sursa de către utilizator

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