Metszéspontja 2 bináris keresés fák

szavazat
1

Hé, így szeretnék létrehozni egy új fát, amely alapvetően a kereszteződés (matematikai definíciója kereszteződés) 2 adott bináris keresés fák. Van egy módszer, amely kiírja az összes csomópont egy bizonyos szinten a fa, és van egy módszer, amely képes kideríteni a mélység a tree.I am beillesztés munkám eddig, bár nem teljes és ragadtam a logic.Help fogják értékelni.

    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);
          }
}
A kérdést 20/04/2011 11:22
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
0

A kereszteződés két fák feltehetően a csomópontokat, amelyek mindkét fák?

Tekintettel arra, hogy akkor is, hogy vizsgálja meg a fa, hogy ezt miért nem csinál egy in-order bejárás, tárolja a csomópontokat, és tegye egy kereszteződést művelet rendezett listák?

Válaszolt 20/04/2011 11:33
a forrás felhasználó

szavazat
3

Meg kell bejárás mindkét fák érdekében ugyanakkor a „szinkronban”.

Azt javaslom, hogy hajtsák végre a Iterable interfész osztály. Ekkor az első értékek mindkét fák. Ha ezek egyenlőek, betette az új fa, és kap a következő értékeket mindkét iterátorokat. Ha nem, akkor iterációt a bejáró a kisebb értékeket, amíg az érték kapsz a legalább akkora, mint az utolsó érték a többi bejáró. Öblítsük és ismételjük.

Válaszolt 20/04/2011 12:19
a forrás felhasználó

szavazat
0

A véleményem az ilyen kereszteződést egyszerű:

Mivel fa A fa és B, hogy megtalálják fa C = A \ B metszik:

1: Másolás vagy fa vagy B Tegyük A jobb érthetőség kedvéért.
Ezt a példányt most a fa C. Most „trim” is.
2: C = C.root_node és b = B.root_node:
ha b == c,
Ismételjük meg az eljárást csomópontok b.left, c.left
Ismételjük meg az eljárást csomópontok b.right, c.right
mást,
Eltávolítás c ( megszüntetve ezáltal minden további gyermekek, ez azt jelentette, nem egyenlők)

Ha ez a végrehajtás működni fog, akkor ne lehessen a iterátorokat és hasonlók, valamint szűkülnek le egy egyszerű rekurzív bejárás. ( Mint ez! )

Kérdezd meg szeretne további pontosítás.

Üdvözlettel.

Válaszolt 20/04/2011 22:38
a forrás felhasználó

szavazat
0

A rekurzív végrehajtását találni metszéspontja a két bináris keresési fák, kitaláltam az alábbi kódot. Nem vagyok nagyon biztos időbonyolultsága, de ez nem működik minden rendben.

érvényteleníti BST :: findIntersection (sejt * root1, sejt * 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);
}

}

Válaszolt 17/09/2012 14:58
a forrás felhasználó

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