Διασταύρωση των 2 δυαδικά δένδρα αναζήτησης

ψήφοι
1

Γεια σου, Θέλω, λοιπόν, να δημιουργήσετε ένα νέο δέντρο που είναι βασικά η τομή (μαθηματικό ορισμό της τομής) 2 δίνεται δυαδικά δένδρα αναζήτησης. Έχω μια μέθοδο που εκτυπώνει το σύνολο των κόμβων σε ένα συγκεκριμένο επίπεδο του δέντρου και έχω μια μέθοδος που μπορεί να βρει το βάθος των tree.I είμαι επικόλληση δουλειά μου μέχρι στιγμής και αν είναι ατελής και είμαι κολλημένος με το logic.Help θα εκτιμηθεί.

    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);
          }
}
Δημοσιεύθηκε 20/04/2011 στις 11:22
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
0

Η τομή των δύο δέντρα είναι κατά πάσα πιθανότητα οι κόμβοι που βρίσκονται σε δύο δέντρα;

Δεδομένου ότι θα πρέπει να διερευνήσει το δέντρο για να το κάνουμε αυτό, γιατί να μην κάνουμε μια διάσχιση στην παραγγελία, την αποθήκευση τους κόμβους και στη συνέχεια να κάνουμε μια λειτουργία διασταύρωση για ταξινομημένες λίστες;

Απαντήθηκε 20/04/2011 στις 11:33
πηγή χρήστη

ψήφοι
3

Θα πρέπει να διάσχιση δύο δέντρα, ώστε ταυτόχρονα και «σε συγχρονισμό».

Θα πρότεινα να εφαρμόσει το Iterable διεπαφή για την τάξη σας. Στη συνέχεια, μπορείτε να πάρετε τις πρώτες τιμές και από τις δύο δέντρα. Αν είναι ίσες, το έβαλε στο νέο δέντρο, και να πάρει τις επόμενες τιμές και από τις δύο επαναλήπτες. Αν όχι, επαναλάβει την iterator με τις μικρότερες τιμές έως ότου η τιμή που παίρνετε είναι τουλάχιστον εξίσου μεγάλη όσο η τελευταία τιμή από την άλλη iterator. Ξεβγάλτε και επαναλάβετε.

Απαντήθηκε 20/04/2011 στις 12:19
πηγή χρήστη

ψήφοι
0

Η πρότασή μου για μια τέτοια τομή είναι απλή:

Δεδομένου δέντρο Α και Β δέντρο, για να βρείτε το δέντρο C = A \ διασταυρώνονται Β:

1: Αντιγραφή είτε δέντρο Α ή Β Ας υποθέσουμε Α για λόγους σαφήνειας.
Αυτό το αντίγραφο είναι τώρα το δέντρο σας C. Τώρα ας «τελειώματα» του.
2: Για c = C.root_node και b = B.root_node:
αν b == c,
Επαναλάβετε τη διαδικασία με κόμβους b.left, c.left
Επαναλάβετε τη διαδικασία με κόμβους b.right, c.right
άλλο,
Κατάργηση c ( εξαλείφοντας έτσι όλα τα επόμενα παιδιά, υπονοείται ότι είναι άνιση)

Εάν αυτή η εφαρμογή θα μπορούσε να λειτουργήσει, θα αποφεύγεται η χρήση του iterators και τα παρόμοια, και καταλήγουν σε ένα απλό αναδρομική διάσχιση. ( Όπως αυτό! )

Ρωτήστε αν θέλετε περαιτέρω διευκρινίσεις.

Χαιρετισμοί.

Απαντήθηκε 20/04/2011 στις 22:38
πηγή χρήστη

ψήφοι
0

Για την αναδρομική εφαρμογή της εύρεσης τομής των δύο δυαδικά δέντρα αναζήτησης, ήρθα με τον ακόλουθο κώδικα. Δεν είμαι πολύ σίγουρος για τη χρονική πολυπλοκότητα, αλλά δεν λειτουργεί εντάξει.

άκυρη BST :: findIntersection (κύτταρο * root1, κύτταρο * 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);
}

}

Απαντήθηκε 17/09/2012 στις 14:58
πηγή χρήστη

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