Průsečík 2 binárních vyhledávacích stromů

hlasů
1

Hej, tak jsem chtěl vytvořit nový strom, který je v podstatě křižovatka (matematická definice křižovatky) 2 daných binárních vyhledávacích stromů. Mám metodu, která vypíše všechny uzly na určité úrovni stromu a mám metodu, která může zjistit hloubku tree.I am vložit svou práci tak daleko, i když to není úplná, a já jsem uvízl s logic.Help ocení.

    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);
          }
}
Položena 20/04/2011 v 11:22
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
0

Průsečík dvou stromů je pravděpodobně uzly, které jsou v obou stromech?

Vzhledem k tomu, že budete mít k prozkoumání stromu, jak to udělat, proč ne jen dělat traversal na objednávku, ukládání uzly a proveďte operaci průnik uspořádané seznamy?

Odpovězeno 20/04/2011 v 11:33
zdroj uživatelem

hlasů
3

Musíte se s překročením jak stromy tak, aby zároveň i „synchronně“.

Já bych navrhnout implementovat Iterable rozhraní pro svou třídu. Pak dostanete první hodnoty z obou stromů. Pokud jsou stejné, dal ho do nového stromu, a získat další hodnoty z obou iterátory. Pokud tomu tak není, opakovat iterátor s menšími hodnotami, dokud se hodnota, kterou dostanete, je přinejmenším stejně velká jako poslední hodnota z druhého iterátoru. Opláchněte a opakujte.

Odpovězeno 20/04/2011 v 12:19
zdroj uživatelem

hlasů
0

Můj návrh na takové křižovatce je jednoduchý:

Vzhledem k tomu, strom A a B strom, najít strom c = a \ protínají B:

1: Kopírování stromové A nebo B. Předpokládejme z důvodů jasnosti.
Tato kopie je nyní váš strom C. Nyní se pojďme ‚výbava‘ to.
2: C = C.root_node a b = B.root_node:
pokud b == c,
opakujte postup s uzly b.left, c.left
opakujte postup s uzly b.right, c.right
jiného,
Odstranit c ( čímž se odstraní všechny další děti, to je znamenal, že jsou nerovné)

Pokud by to implementace fungovat, bude to vyhnout se používání iterátorů a podobně, a redukuje na jednoduchou rekurzivní průchod. ( Takhle! )

Zeptejte se, zda máte zájem o další objasnění.

Pozdravy.

Odpovězeno 20/04/2011 v 22:38
zdroj uživatelem

hlasů
0

Pro rekurzivní provádění zjištění průsečík dvou binárních vyhledávacích stromů, jsem přišel s následující kód. Nejsem si moc jistý časové složitosti, ale to funguje v pořádku.

ztrátu BST :: findIntersection (buňka * root1, buňka * 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);
}

}

Odpovězeno 17/09/2012 v 14:58
zdroj uživatelem

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