Пересечение 2 бинарных деревьев поиска

голоса
1

Эй, Так что я хочу, чтобы создать новое дерево, которое в основном пересечение (математическое определение пересечения) 2 заданных бинарных деревьев поиска. У меня есть метод, который печатает все узлы на определенном уровне дерева и у меня есть метод, который может узнать глубину tree.I я вставив свою работу до сих пор, хотя она является неполной и я застрял с logic.Help будет оценен.

    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);
          }
}
Задан 20/04/2011 в 11:22
источник пользователем
На других языках...                            


4 ответов

голоса
0

Пересечение двух деревьев, предположительно, узлы, которые находятся в обоих деревьях?

Учитывая, что вы должны будете исследовать дерево, чтобы сделать это, почему бы просто не сделать обход в заказ, хранить узлы, а затем выполнить операцию пересечения на упорядоченных списков?

Ответил 20/04/2011 в 11:33
источник пользователем

голоса
3

Вы должны обход как дерева, чтобы в то же время и «синхронизация».

Я хотел бы предложить, чтобы реализовать Iterable интерфейс для вашего класса. После этого вы получите первые значения из обоих деревьев. Если они равны, положить его в новом дереве, и получить следующие значения обоих итераторов. Если нет, то итерация итератора с меньшими значениями, пока значение, которое вы получаете не как минимум столь же большое, как последнее значение из другого итератора. Промыть и повторить.

Ответил 20/04/2011 в 12:19
источник пользователем

голоса
0

Мое предложение для такого пересечения просто:

Учитывая дерево А и дерево B, чтобы найти дерево C = A \ B пересекаются:

1: Скопируйте либо дерева А или В. Пусть А при ясности.
Эта копия теперь ваше дерево C. Теперь давайте «обрезать» его.
2: При с = C.root_node и Ь = B.root_node:
если Ь == с,
повторить процедуру с узлами b.left, c.left
Повторите процедуру с узлами b.right, c.right
еще,
Удалить с ( удаляя таким образом все последующие дети, подразумевается , что они не равны)

Если эта реализация будет работать, это позволило бы избежать использования итераторов и тому подобные, и сводится к простому рекурсивному обходу. ( Как это! )

Спросите, если вы хотите в дальнейшем уточнении.

С уважением.

Ответил 20/04/2011 в 22:38
источник пользователем

голоса
0

Для рекурсивной реализации поиска пересечения двух бинарных деревьев поиска, я придумал следующий код. Я не очень уверен, временной сложности, но это не работает все в порядке.

аннулированию BST :: findIntersection (клетка * root1, клетка * 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);
}

}

Ответил 17/09/2012 в 14:58
источник пользователем

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