Учитывая два двоичных дерева, проверьте, является ли первое дерево поддеревом второго. Поддерево дерева T — это дерево S, состоящее из узла в T и всех его потомков в T.
Поддерево, соответствующее корневому узлу, является целым деревом; поддерево, соответствующее любому другому узлу, называется правильным поддеревом.
Например, в следующем случае Tree1 является поддеревом Tree2.
Tree1 x / \ a b \ c Tree2 z / \ x e / \ \ a b k \ c
Мы обсудили O (n 2 ) решение этой проблемы . В этом посте обсуждается решение O (n). Идея основана на том факте, что inorder и preorder / postorder однозначно идентифицируют двоичное дерево . Дерево S является поддеревом T, если как обходы по порядку, так и по предзаказу из S являются подстроками обхода по неупорядочению и предзаказу для T соответственно.
Ниже приведены подробные шаги.
1 ) Найдите обходы порядка и предзаказа T, сохраните их в двух вспомогательных массивах inT [] и preT [].
2 ) Найдите обходы порядка и предзаказа S, сохраните их в двух вспомогательных массивах inS [] и preS [].
3 ) Если inS [] является подмассивом inT [] и preS [] является подмассивом preT [], то S является поддеревом T. Иначе нет.
Мы также можем использовать обход по порядку вместо предварительного заказа в приведенном выше алгоритме.
Давайте рассмотрим приведенный выше пример
Inorder and Preorder traversals of the big tree are. inT[] = {a, c, x, b, z, e, k} preT[] = {z, x, a, c, b, e, k} Inorder and Preorder traversals of small tree are inS[] = {a, c, x, b} preS[] = {x, a, c, b} We can easily figure out that inS[] is a subarray of inT[] and preS[] is a subarray of preT[].
РЕДАКТИРОВАТЬ
The above algorithm doesn't work for cases where a tree is present in another tree, but not as a subtree. Consider the following example. Tree1 x / \ a b / c Tree2 x / \ a b / \ c d Inorder and Preorder traversals of the big tree or Tree2 are. Inorder and Preorder traversals of small tree or Tree1 are The Tree2 is not a subtree of Tree1, but inS[] and preS[] are subarrays of inT[] and preT[] respectively.
Вышеприведенный алгоритм может быть расширен для обработки таких случаев, добавляя специальный символ всякий раз, когда мы сталкиваемся с NULL в обходах по порядку и предзаказу. Спасибо Шиваму Гоэлу за предложение об этом расширении.
Ниже приведена реализация вышеуказанного алгоритма.
|
Джава
|
C #
|
Выход:
No: S is NOT a subtree of T
Сложность времени: обходы по бинарному дереву по неупорядочению и по предзаказу занимают O (n) времени. Функция strstr () также может быть реализована за O (n) время с использованием алгоритма сопоставления строк KMP .
Вспомогательное пространство: O (n)
Спасибо Ашвини Сингх за предложение этого метода. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Проверить, является ли двоичное дерево поддеревом другого двоичного дерева | Комплект 1
- Проверьте, имеет ли данное двоичное дерево поддерево с равным ни 1, ни 0
- Проверьте, является ли двоичное дерево полным двоичным деревом или нет | Итеративный подход
- Поддерево с заданной суммой в двоичном дереве
- Двойное поддерево в двоичном дереве | SET 2
- Найти наибольшее поддерево BST в данном двоичном дереве | Комплект 1
- Найти наибольшее полное поддерево в данном двоичном дереве
- Найти наибольшее совершенное поддерево в данном двоичном дереве
- Преобразуйте двоичное дерево так, чтобы каждый узел сохранял сумму всех узлов в своем правом поддереве
- Проверьте, является ли двоичное дерево полным двоичным деревом или нет
- Проверьте, является ли данное двоичное дерево перекошенным двоичным деревом или нет?
- Измените двоичное дерево так, чтобы каждый узел сохранял сумму всех узлов в левом поддереве
- При заданном уровне порядка обхода двоичного дерева, проверьте, является ли дерево минимальной кучей
- Проверьте, является ли двоичное дерево полным деревом | Набор 2 (Рекурсивное решение)
- Проверьте, сбалансировано ли данное Двоичное Дерево как Красно-Черное Дерево
0.00 (0%) 0 votes