Skjæringspunktet mellom 2 binære søketrær

stemmer
1

Hei, Så jeg ønsker å skape et nytt tre som er utgangspunktet krysset (matematisk definisjon av krysset) av 2 gitte binære søketrær. Jeg har en metode som skriver ut alle nodene på et bestemt nivå av treet, og jeg har en metode som kan finne ut dybden av tree.I jeg lime mitt arbeid så langt om det er ufullstendig, og jeg er stuck med logic.Help vil bli verdsatt.

    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);
          }
}
Publisert på 20/04/2011 klokken 10:22
kilden bruker
På andre språk...                            


4 svar

stemmer
0

Skjæringspunktet mellom to trær er antagelig de noder som er i begge trær?

Gitt at du må utforske treet for å gjøre dette, hvorfor ikke bare gjøre en in-order traversering, lagre nodene og deretter gjøre et veikryss operasjon på bestilt lister?

Svarte 20/04/2011 kl. 10:33
kilden bruker

stemmer
3

Du må traversering både trær for samtidig og "synkronisert".

Jeg vil foreslå å gjennomføre Iterable grensesnitt for din klasse. Da får du de første verdiene fra både trær. Hvis de er like, legg den i det nye treet, og få de neste verdiene fra begge iteratorer. Hvis ikke, gjenta iterator med mindre verdier inntil verdien du får er minst like stor som den siste verdien fra den andre iterator. Skyll og gjenta.

Svarte 20/04/2011 kl. 11:19
kilden bruker

stemmer
0

Mitt forslag for et slikt kryss er enkel:

Gitt tre A og tre B, for å finne tre C = A \ skjærer B:

1: Kopier enten tre A eller B. La oss anta A for klarhet.
Denne kopien er nå treet C. La oss nå 'trimme' den.
2: For c = C.root_node og b = B.root_node:
hvis b == c,
Gjenta fremgangsmåten med noder b.left, c.left
Gjenta fremgangsmåten med noder b.right, c.right
andre,
fjern c ( for derved å fjerne alle etterfølgende barn, er det underforstått at de ikke er like)

Hvis denne implementeringen ville fungere, ville det unngå bruk av iteratorer og lignende, og koke ned til en enkel rekursiv traversering. ( Liker du dette! )

Spør hvis du ønsker ytterligere avklaring.

Hilsen.

Svarte 20/04/2011 kl. 21:38
kilden bruker

stemmer
0

For den rekursive gjennomføringen av å finne skjæringspunktet mellom to binære søketrær, kom jeg opp med følgende kode. Jeg er ikke helt sikker på den tiden kompleksitet, men det fungerer greit.

ugyldig BST :: findIntersection (celle * root1, celle * 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);
}

}

Svarte 17/09/2012 kl. 13:58
kilden bruker

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