Given a binary tree, check
whether it is a mirror of itself (i.e. symmetric around its center).
For example, this binary
tree is symmetric:
But the following is not:
Задано бинарное дерево. Проверьте,
является ли оно зеркальным отображением самого себя (то есть является ли оно
симметрическим относительно центра).
// C++
class
Solution {
public:
bool isSymmetric(TreeNode* root) {
}
};
// Java
public class
Solution {
public boolean isSymmetric(TreeNode root) {
}
};
структуры данных - деревья
Если root = NULL, то дерево
симметрично. Иначе запускаем функцию Helper, которая проверяет, являются ли два
дерева left и right симметрическими отображениями друг друга. Исходное дерево
будет симметричным, если его левый и правый сын являются симметрическими
отображениями друг друга.
Опишем работу функции Helper:
·
Если left и right равны NULL, то деревья симметричны.
·
Если одно из
деревьев (left или right) равно NULL, а второе не NULL, то
деревья не симметричны.
Для того чтобы деревья left и right были симметрическими отображениями
друг друга, необходимо и достаточно чтобы:
·
left -> val и right -> val были
равны;
·
симметрическими
отображениями друг друга были left -> left и right -> right;
·
симметрическими
отображениями друг друга были left -> right и right -> left;
Реализация алгоритма
class Solution
{
public:
bool isSymmetric(TreeNode *root)
{
if(root == NULL)
return true;
return Helper(root->left,root->right);
}
bool Helper(TreeNode* left, TreeNode* right)
{
if(left == NULL && right == NULL)
return true;
else if(left == NULL
|| right == NULL)
return false;
bool cond1 = left->val == right->val;
bool cond2 = Helper(left->left,right->right);
bool cond3 = Helper(left->right, right->left);
return cond1 && cond2 && cond3;
}
};
Java реализация
public
class Solution
{
public boolean isSymmetric(TreeNode root)
{
if(root == null)
return true;
return Helper(root.left,root.right);
}
boolean
Helper(TreeNode left, TreeNode right)
{
if(left == null && right == null)
return true;
else if(left == null
|| right == null)
return false;
boolean cond1 =
left.val == right.val;
boolean cond2 =
Helper(left.left,right.right);
boolean cond3 =
Helper(left.right, right.left);
return cond1 && cond2 && cond3;
}
}