Сравнивайте соответствующие узлы: два пустых дерева равны, только одно пустое — нет. Для непустых узлов должны совпасть значение, левое и правое поддеревья.
Проверка идентичности двух бинарных деревьев
Сравнивайте соответствующие узлы: два пустых дерева равны, только одно пустое — нет. Для непустых узлов должны совпасть значение, левое и правое поддеревья.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию isSameTree, которая определяет, одинаковы ли два бинарных дерева. Два дерева считаются одинаковыми, если их структуры совпадают и все соответствующие узлы содержат одинаковые значения.
class ForInterview {
public:
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};
bool isSameTree(TreeNode* p, TreeNode* q) {
// реализовать
}
};
Ответ
Сравнивайте соответствующие узлы: два пустых дерева равны, только одно пустое — нет. Для непустых узлов должны совпасть значение, левое и правое поддеревья.
Вставьте в класс следующую реализацию:
bool isSameTree(TreeNode* p, TreeNode* q) {
if (!p || !q) return p == q;
return p->val == q->val
&& isSameTree(p->left, q->left)
&& isSameTree(p->right, q->right);
}
Проверка структуры обязательна: одинакового набора значений недостаточно. В худшем случае время O(n), дополнительная память O(h) для стека, где h — высота дерева. Для очень глубоких деревьев лучше явный стек пар узлов.