Re: Срочно требуется алгоритм сравнения бинарных деревьев.

From
Oleg I. Khovayko ()
To
Slava Antonov
Date
2003-01-07T17:23:09Z
Area
RU.ALGORITHMS
From: "Oleg I. Khovayko" <olegh@ncbi.nlm.nih.gov>

ATTN: ниже под словом "символ" подразумевается некий уникальный идентификатор
узла дерева. В примере входной задачи были использованы символы A,B.

Slava Antonov wrote:
> 
> Причем он должен считать вот такие деревья одинаковыми:
> 
>   /\          /\
> A   B       B  A


Ну, так это элементарно!

1. Для каждого дерева делать:
 1.1. Обойти дерево любым способом, и свалить из него содержимое в массив.
      Но свалить не только символ в узле дерева, а символ, конкатенированый с 
      с символом родителя через какой-нибудь разделитель, не встречающийся 
      в названии узла, причем порядок конкатенации не важен.
 1.2. Сортируем массив

2. Сравнили массивы для обеих деревьев. 
   Если они одинаковы - деревья тоже одинаковы. Все.

Пример:

Дерево_1:

entity
  fish
    salmon
    catfish 
  animal
    cat
    dog
  drug
    fentanil
    aspirin

Дерево_2:

entity
  animal
    dog
    cat
  drug
    aspirin
    fentanil
  fish
    salmon
    catfish 

Для обоих деревьев выгруженый массив будет иметь строчки:
entity/fish
entity/animal
entity/drug
animal/dog
animal/cat
drug/aspirin
drug/fentanil
fish/salmon
fish/catfish

После сортировки оба массива будут одинаковы.

Вместо имен из узлов можно пользоваться указателями на узлы,
или некими уникальными номерами узлов.
В последнем случае, если номер узла помещается в 16 бит,
то в массив можно сваливать int-ы, полученные как: 
int K = (N_предка << 16) | N_тек_узла;
Допустимы и любые другие правила конкатенации. Важно лишь,
чтобы конкатенированный результирующий символ в данном 
контексте был уникальным.

-- 
#include <best/regards.hpp>
Oleg I. KHOVAYKO  
(301)435-5885 || WEB: http://olegh.spedia.net
--- ifmail v.2.15dev5
 * Origin: National Center for Biotechnology Information (2:5020/400)