[牛 客 网 -Leetcode] # 树 zhongsymmetric-tree

Á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
Inserte la descripción de la imagen aquí

El árbol binario de abajo es asimétrico.
Inserte la descripción de la imagen aquí
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:

Inserte la descripción de la imagen aquí

Pero lo siguiente no es:

Inserte la descripción de la imagen aquí

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;
        }
    }
};

Supongo que te gusta

Origin blog.csdn.net/cys975900334/article/details/106967086
Recomendado
Clasificación