Intersection de 2 arbres binaires de recherche

voix
1

Hé, je veux créer un nouvel arbre qui est essentiellement l'intersection (définition mathématique d'intersection) de 2 données arbres binaires de recherche. J'ai une méthode qui imprime tous les noeuds à un niveau particulier de l'arbre et j'ai une méthode qui peut connaître la profondeur des tree.I suis coller mon travail jusqu'à présent si elle est incomplète et je suis coincé avec le logic.Help sera apprécié.

    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);
          }
}
Créé 20/04/2011 à 11:22
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
0

L'intersection des deux arbres est sans doute les nœuds qui sont dans les deux arbres?

Étant donné que vous devrez explorer l'arbre pour ce faire, pourquoi ne pas faire juste un traversal en ordre, stocker les noeuds puis effectuez une opération d'intersection sur les listes ordonnées?

Créé 20/04/2011 à 11:33
source utilisateur

voix
3

Vous devez Traversal les deux arbres pour en même temps et « en phase ».

Je vous suggère d'implémenter l'interface Iterable pour votre classe. Ensuite, vous obtenez les premières valeurs des deux arbres. Si elles sont égales, le mettre dans le nouvel arbre, et obtenir les valeurs des deux prochaines itérateurs. Dans le cas contraire, itérer l'itérateur avec les valeurs plus petites jusqu'à ce que la valeur que vous obtenez est au moins aussi grande que la dernière valeur de l'autre itérateur. Rincer et répéter.

Créé 20/04/2011 à 12:19
source utilisateur

voix
0

Ma suggestion pour une telle intersection est simple:

Compte tenu de l'arbre A et B arbre, pour trouver l'arbre C = A \ B Intersection:

1: Copier soit l' arbre A ou B. Supposons A pour plus de clarté.
Cette copie est maintenant votre arbre C. « trim » Maintenant , nous allons lui.
2: Pour c = C.root_node et b = B.root_node:
si b == c,
Répétez la procédure avec des noeuds b.left, c.left
Répétez la procédure avec des noeuds b.droit, c.right
autre,
Retirer c ( supprimant ainsi tous les enfants subséquents, il est sous - entendu , ils sont inégaux)

Si cette mise en œuvre fonctionnerait, il éviterait l'utilisation des itérateurs et autres, et faire bouillir à un simple traversal récursive. ( Comme ça! )

Demandez si vous souhaitez plus de précisions.

Cordialement.

Créé 20/04/2011 à 22:38
source utilisateur

voix
0

Pour la mise en œuvre récursive de trouver l'intersection de deux arbres binaires de recherche, je suis venu avec le code suivant. Je ne suis pas très sûr de la complexité du temps, mais il ne fonctionne bien.

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

}

Créé 17/09/2012 à 14:58
source utilisateur

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