2 ikili arama ağaçları Kesişme

oy
1

Hey, Ben temelde 2 Verilen ikili arama ağaçları kesişimi (kesişim matematiksel tanım) yeni bir ağaç oluşturmak istiyorum. Ben ağacın belli bir düzeydeki tüm düğümleri yazdıran bir yöntem var ve bu eksik ve ben onunla şaşırıp olsa bugüne kadar işimi yapıştırarak ediyorum tree.I derinliğini öğrenmek bir yönteme sahip logic.Help takdir edilecektir.

    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);
          }
}
Oluştur 20/04/2011 saat 11:22
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
0

iki ağaç kesişimi muhtemelen her iki ağaçlara düğümleri,?

Bunu yapmak için ağaç keşfetmek gerekecek göz önüne alındığında, neden sadece, bir in-sipariş geçişi yapmak düğümleri depolamak ve daha sonra sıralı listeler üzerinde bir kavşak çalışmasını yapamaz?

Cevap 20/04/2011 saat 11:33
kaynak kullanıcı

oy
3

Aynı anda ve "senkronize" için her iki ağaçları travers gerekiyor.

Ben senin sınıf için iterable arabirimini uygulamak öneririm. Sonra her iki ağaçlardan ilk değerleri olsun. onlar eşitse, yeni ağacın içine koyun ve her iki yineleyiciler sonraki değerleri olsun. Değilse Alacağınız değer diğer İlerleticiden son değere kadar az büyük olana kadar, daha küçük değerlerle yineleyici yineleme. Baştan başlayın.

Cevap 20/04/2011 saat 12:19
kaynak kullanıcı

oy
0

Böyle bir kavşak için önerim basit:

B kesiştiği ağaç C = A \ bulmak için, ağaç A ve ağaç B Verilen:

1: ya ağaç A kopyalama veya B. bizi netlik için bir varsayalım.
Bu kopya şimdi ağaç C., artık bu 'trim' izin vermek.
2: c = C.root_node ve b için = B.root_node:
b == C, eğer
düğüm b.left ile prosedürü tekrarlayın, c.left
c.right, düğümler b.right ile prosedürü tekrarlayın
başka,
c çıkarın ( sonraki tüm çocukları kaldırarak böylece, bu) onların eşitsiz olduğu ima edilmektedir

Bu uygulama çalışacak, bu yineleyiciler ve benzeri kullanımını önlemek ve basit özyinelemeli geçişi aşağı kaynatın olacaktır. ( Bu gibi! )

Eğer daha fazla açıklama isterseniz sor.

Saygılarımızla.

Cevap 20/04/2011 saat 22:38
kaynak kullanıcı

oy
0

İki ikili arama ağaçları kesişimini bulma özyinelemeli uygulanması için, aşağıdaki kodu ile geldi. Zamanın karmaşıklığı çok emin değilim, ama tüm hakkı çalışmak yok.

{BST :: findIntersection (hücre * root1, hücre * root2) geçersiz

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);
}

}

Cevap 17/09/2012 saat 14:58
kaynak kullanıcı

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