2013-05-05 4 views
10

Я хочу узнать, является ли бинарное дерево T2 поддеревом двоичного дерева T1. Я прочитал, что можно было построить строковые представления для T2 и T1, используя предварительные и обходные последовательности, и если строки T2 являются подстроками строк T1, T2 является поддеревом T1.Определите, является ли двоичное дерево поддеревом другого двоичного дерева, используя строки предварительного порядка и в порядке порядка

Я немного смущен этим методом и не уверен в его правильности.

От wiki: «Поддерево дерева T - это дерево, состоящее из узла в T и всех его потомков в T.»

В следующем примере:

T2: 
    1 
/\ 
2 3 

T1: 
    1 
/\ 
2 3 
    \ 
     4 

Если мы строим струны для Т2 и Т1:

предпорядок T2: "1,2,3"
предпорядок Т1: «1,2, 3,4"
T2: симметричного „2,1,3“
заказовМои T1: „2,1,3,4“

струны Т2 подстроки T1, поэтому с использованием метода согласования подстроки д выше, мы должны заключить, что T2 является поддеревом T1.

Однако T2 по определению не должен быть поддеревом T1, поскольку он не имеет всех потомков корневого узла T1.

Существует связанное обсуждение here, которое, похоже, завершает метод.

Я что-то упустил?

ответ

8

Очень интересный вопрос. Кажется, ты прав. Я полагаю, что проблема, о которой вы упоминаете, возникает из-за различных определений поддерева в math (graph theory) и информатики. В теории графов T2 является собственным поддеревом T1.

0

Определение поддерева дерева должно быть таким же, как определение подстроки строки. Подумайте об этом так: 1. Подстрока начинается с, содержит и кончается. 2. Дерево также должно иметь одно и то же определение, но обобщенное в соответствии с структурой данных дерева. 3. Обобщение от 1-мерного для строки до 2-мерного для дерева.

-1

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

Рассмотрим следующий деревья

T2: 
    B 
/\ 
A C 

T1: 
    C 
/\ 
    B C 
/
A 

предпорядка T2: 'БАК'
предпорядок Т1: 'CBAC'
Симметричного T2: 'ABC'
Симметричного T1: 'ЦКА'

Опять же, строки T2 являются подстроками их T1-аналогов, и все же T2 никоим образом не является поддеревом T1. Возможно, в авторе были исключены дубликаты и конкретно упомянул о его определении поддерева, это может быть правильно, но, оставляя эту информацию, у нас нет выбора, кроме как считать ее неправильным решением.

+0

вы не можете повторно использовать' C' подобное, что не как теория работает , –

+0

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

+0

"можно было построить строковые представления для T2 и T1, используя предварительные и обходные последовательности, и если строки T2 являются подстроками строк T1, T2 является поддеревом T1." Эта теория может быть только правильной, если каждый узел имеет уникальный характер. Если вам нужно больше символов, вам также нужен метод, чтобы быть явным, о том, где начинается имя узла, например имена узлов начинаются с прописных букв, а все остальные символы строчные. –

-2

Na ... Этот подход неверен. Поскольку разные деревья могут иметь одинаковый обход. Например здесь, в данном примере, дерево

  26 
     / \ 
     10  3 
    / \  \ 
    4  6  3 
    \ 
    30 

и кандидат поддерева

10 
/\ 
4 6 
\ 
30 

и

30 
/\ 
4 10 
\ 
6 

имеют то же Симметричный обходе в 4,30,10, 6 , но второй не является поддеревом

+1

В обход последнего дерева не входит 4,30,10,6. Это 4,6,30,10 –

6

Предполагая, что вы получили это из книги «Crac King the Coding Interview ", автор также упоминает, что для разграничения между узлами с одинаковыми значениями следует также печатать нулевые значения.

Это позволило бы решить проблему с определением поддерева (который является правильным, как и описано в книге)

предзаказ T2: "1, 2, NULL, NULL, 3, NULL, NULL" preorder T1: "1, 2, null, null, 3, null, 4, null, null" inorder T2: "null, 2, null, 1, null, 3, null" inorder T1: "null, 2, нуль, 1, NULL, 3, нуль, 4, нуль»

Как вы можете видеть, T2 не поддерево T1

Смежные вопросы