Árbol simétrico
Descripción del Título
Dado un árbol binario, juzga si Qi es una imagen especular de sí mismo (es decir, si es simétrico).
Por ejemplo: el siguiente árbol binario es simétrico
El árbol binario de abajo es asimétrico.
Nota:
Si usa la recursividad y la iteración para resolver este problema, puede obtener puntos adicionales.
Dado un árbol binario, verifique si es un espejo de sí mismo (es decir, simétrico alrededor de su centro).
Por ejemplo, este árbol binario es simétrico:
Pero lo siguiente no es:
Nota:
Puntos de bonificación si pudieras resolverlo de forma recursiva e iterativa.
Ejemplo
Entrada del ejemplo 1
{1,2,2}
Producción
cierto
Entrada del ejemplo 2
{1,2,3,3, #, 2, #}
Producción
falso
Ideas para resolver problemas
- Aclare la función de la función de verificación: determine si los dos árboles con root1 y root2 como los nodos raíz son simétricos
- Ambos nodos están vacíos, devuelve verdadero directamente
- Uno de los dos nodos está vacío, el otro no está vacío, devuelve falso directamente
- Ambos nodos no están vacíos y los valores de los nodos no son iguales, devuelve falso directamente
- Si los dos nodos no están vacíos y los valores de los nodos son iguales, la recursividad continúa.
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
return check(root -> left, root -> right);
}
//判断以root1和root2为根节点的两棵树是否对称
bool check(TreeNode* root1, TreeNode* root2) {
//两个节点均为空,直接返回true
if(!root1 && !root2) return true;
//两个节点一个为空,另一个不空,直接返回false
if(!root1 || !root2) return false;
//两个节点均不为空
if(root1 -> val == root2 -> val) {
//节点值相等,则继续递归
return check(root1 -> left, root2 -> right) && check(root1 -> right, root2 -> left);
} else {
//节点值不相等,直接返回false
return false;
}
}
};