Przecięcie 2 Wyszukaj binarnych drzew

głosy
1

Hej, więc chcę, aby utworzyć nowe drzewa, które jest w zasadzie przecięcia (Matematyczna definicja przecięcia) z 2 podanych binarne drzewo poszukiwań. Mam metodę, która drukuje wszystkie węzły na określonym poziomie drzewa i mam metodę, która może znaleźć się na głębokość tree.I jestem wklejając moją pracę tak daleko choć jest niekompletny i utknąłem z logic.Help zostaną docenione.

    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);
          }
}
Utwórz 20/04/2011 o 11:22
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
0

Przecięcie dwóch drzew jest przypuszczalnie węzły, które są w obu drzewach?

Biorąc pod uwagę, że trzeba będzie zbadać drzewo, aby to zrobić, dlaczego nie zrobić przechodzenie na zamówienie, przechowywać węzły, a następnie wykonaj operację przecięcia na uporządkowanych list?

Odpowiedział 20/04/2011 o 11:33
źródło użytkownik

głosy
3

Masz do przejścia obu drzewach, aby w tym samym czasie i „zsynchronizowane”.

Sugeruję, aby wdrożyć Iterable interfejs dla swojej klasy. Następnie pojawi się pierwsze wartości z obu drzew. Jeśli są równe, umieścić go w nowym drzewie i uzyskać kolejne wartości z obu iteratorów. Jeśli nie, iteracyjne iteracyjnej z mniejszymi wartościami, aż pojawi się wartość jest co najmniej tak duża, jak ostatniej wartości z drugiego iteratora. Wypłukać i powtórzyć.

Odpowiedział 20/04/2011 o 12:19
źródło użytkownik

głosy
0

Moja propozycja dla takiego skrzyżowania jest prosta:

Biorąc pod uwagę, drzewo drzewa A i B, aby znaleźć drzewo c = a \ przecinają B:

1: Skopiuj albo drzewie lub B. Załóżmy A dla jasności.
Ta kopia jest teraz drzewo C. Teraz „przyciąć” go.
2: C = C.root_node B = B.root_node:
jeśli B == C
powtórzyć procedurę z węzłami b.left, c.left
powtórzyć procedurę z węzłami b.right, c.right
indziej
usunąć C ( usuwając wszystkie kolejne dzieci, to zakłada się, że są nierówne)

Jeśli ta implementacja będzie działać, to unikanie stosowania iteratory i tym podobne, i sprowadza się do prostego rekurencyjnego przechodzenia. ( Like this! )

Zapyta, czy chcesz dalszych wyjaśnień.

Pozdrowienia.

Odpowiedział 20/04/2011 o 22:38
źródło użytkownik

głosy
0

Dla implementacji rekurencyjnej znalezienia przecięcia dwóch wyszukiwania binarnych drzew, wpadłem na następujący kod. Nie jestem bardzo pewny złożoności czasu, ale działa dobrze.

unieważnić BST :: findIntersection (komórka * KatalogGłówny1, komórka * 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);
}

}

Odpowiedział 17/09/2012 o 14:58
źródło użytkownik

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