Kreuzung von 2 binären Suchbäumen

stimmen
1

Hey, So will ich einen neuen Baum schaffen, die im Grunde ist der Schnittpunkt (mathematische Definition des Schnittpunktes) 2 gegeben binärer Suchbäume. Ich habe eine Methode, die auf einer bestimmten Ebene des Baumes alle Knoten ausdruckt und ich habe eine Methode, die die Tiefe der tree.I herausfinden kann, meine Arbeit so weit ist Einfügen obwohl es unvollständig ist, und ich bin fest mit der logic.Help wird geschätzt.

    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);
          }
}
Veröffentlicht am 20/04/2011 um 11:22
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
0

Der Schnittpunkt von zwei Bäumen ist vermutlich die Knoten, die in beiden Bäume sind?

Da muss man würde den Baum erkundet, dies zu tun, warum nicht nur einen In-Order-Traversal, speichern Sie die Knoten und dann einen Schnittvorgang tun auf geordnete Listen?

Beantwortet am 20/04/2011 um 11:33
quelle vom benutzer

stimmen
3

Sie haben beide Bäume zur gleichen Zeit, um Querung und „synchron“.

Ich würde vorschlagen, die Iterable Schnittstelle für Ihre Klasse zu implementieren. Dann erhalten Sie die ersten Werte von den beiden Bäumen. Wenn sie gleich sind, setzen Sie es in den neuen Baum, und die nächsten Werte von beiden Iteratoren erhalten. Wenn nicht, wiederholen den Iterator mit den kleineren Werten, bis der Wert, den Sie bekommen mindestens so groß wie der letzte Wert vom anderen Iterator ist. Spülen und wiederholen.

Beantwortet am 20/04/2011 um 12:19
quelle vom benutzer

stimmen
0

Mein Vorschlag für eine solche Kreuzung ist einfach:

Gegeben Baum A und B Baum, Baum C = A \ intersect B zu finden:

1: Kopieren Sie entweder Baum A oder B. Lassen Sie uns A für Klarheit übernehmen.
Diese Kopie ist jetzt Ihr Baum Nun C. wir ‚schneiden‘ es.
2: Für c = C.root_node und b = B.root_node:
wenn b == c,
das Verfahren mit Knoten b.left wiederholen, c.left
den Vorgang mit Knoten b.right wiederholen, c.right
sonst,
entfernen c ( dadurch alle nachfolgenden Kinder zu entfernen, wird es implizit sind sie ungleich)

Wenn diese Implementierung funktionieren würde, würde es die Verwendung von Iteratoren vermeiden und dergleichen, und lässt sich auf eine einfache rekursive Traversal. ( So! )

Fragen Sie, ob Sie weitere Informationen wünschen.

Grüße.

Beantwortet am 20/04/2011 um 22:38
quelle vom benutzer

stimmen
0

Für die rekursive Implementierung von Schnittpunkt von zwei binären Suchbäumen zu finden, kam ich mit dem folgenden Code auf. Ich bin nicht sehr sicher über die Zeit Komplexität, aber es funktioniert alles gut funktioniert.

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

}

Beantwortet am 17/09/2012 um 14:58
quelle vom benutzer

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