Snijpunt van 2 binaire zoekboom

stemmen
1

Hey, Dus ik wil een nieuwe boom die in feite de kruising (wiskundige definitie van de kruising) van 2 gegeven binary search bomen te creëren. Ik heb een methode die op een bepaald niveau van de boom drukt alle knooppunten en ik heb een methode die kan vinden van de diepte van de tree.I ben plakken mijn werk tot nu toe al is het onvolledig is en ik zit vast met de logic.Help zal worden gewaardeerd.

    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);
          }
}
De vraag is gesteld op 20/04/2011 om 11:22
bron van user
In andere talen...                            


4 antwoorden

stemmen
0

Het snijpunt van twee bomen is vermoedelijk de knooppunten die in beide bomen?

Gezien het feit dat je moet de boom om dit te doen te verkennen, waarom niet gewoon doen een in-orde traversal, slaan de knooppunten en doe dan een kruispunt operatie op geordende lijsten?

antwoordde op 20/04/2011 om 11:33
bron van user

stemmen
3

Je moet zowel bomen traversal met het oog op hetzelfde moment en "in sync".

Ik stel voor om de uitvoering van de Iterable interface voor je klas. Dan krijg je de eerste waarden van beide bomen. Als ze gelijk zijn, zet het in de nieuwe boom, en krijg de volgende waarden uit beide iterators. Zo niet, herhaal de iterator met de kleinere waarden tot de waarde die u krijgt is minstens zo groot als de laatste waarde van de andere iterator. Spoel en herhaal.

antwoordde op 20/04/2011 om 12:19
bron van user

stemmen
0

Mijn suggestie voor een dergelijke kruising is eenvoudig:

Gezien boom A en boom B, tot boom C = A \ vinden snijden B:

1: Kopieer ofwel boom A of B. Laten we aannemen A voor de duidelijkheid.
Dit exemplaar is nu uw boom C. Laten we nu eens 'trimmen' het.
2: Bij c = C.root_node en b = B.root_node:
Als b == c
Herhaal de procedure knooppunten b.Klik met de linker, c.left
Herhaal de procedure knooppunten b.right, c.right
anders
Verwijderen c ( waarbij alle volgende kinderen verwijderen, wordt geïmpliceerd dat ze ongelijk)

Als deze implementatie zou werken, zou het het gebruik van iterators en dergelijke te voorkomen, en neer op een eenvoudige recursieve traversal. ( Als dit! )

Vraag of u wilt verdere verduidelijking.

Vriendelijke groeten.

antwoordde op 20/04/2011 om 22:38
bron van user

stemmen
0

Voor de recursieve uitvoering van het vinden van kruising van twee binaire zoekboom, ik kwam met de volgende code. Ik ben niet erg zeker van de tijd complexiteit, maar het werkt goed.

ongeldig BST :: findIntersection (cel * root1, mobiele * 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);
}

}

antwoordde op 17/09/2012 om 14:58
bron van user

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