2 preguntas cara: árbol binario simétrico (C ++)

Tema Dirección: https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/

título Descripción

Por favor implementar una función, un árbol binario se utiliza para determinar no simétrica. Si un árbol binario y su imagen, ya que es simétrica.

Por ejemplo, un árbol binario [1,2,2,3,4,4,3] es simétrica.

    1
   / \
  22
 / \ / \
3443
pero el siguiente [1,2,2, null, 3, null , 3] no es una imagen de espejo:

    1
   / \
  2 2
   \ \
   3 3

Ejemplos de temas

Ejemplo 1:

Entrada: root = [1,2,2,3,4,4,3]
de salida: true
Ejemplo 2:

Entrada: root = [1,2,2, null, 3, null, 3]
de salida: false

Ideas de resolución de problemas

DFS

(1) Recursive: método recursivo determina si los subárboles izquierdo y derecho del mismo valor, en particular si los subárboles divididas izquierda y derecha son subárbol vacío, subárbol izquierdo y subárbol derecho es completa, y la izquierda y el subárbol hijo derecho varios valores de árboles son iguales, cuando se deja y subárboles rectos son iguales, un nodo izquierdo y un nodo derecho de la subárbol derecho comparativo dejó subárbol, y el nodo de la izquierda y derecha del nodo subárbol izquierdo y subárbol derecho.

(2) no recursivo - Pila : el uso de dos punteros p y q atraviesa subárbol izquierdo y subárbol derecho, en el que el puntero P ha sido atravesado de orden transversal izquierda del subárbol izquierdo nodo raíz -> el nodo izquierdo -> el nodo derecho puntero q tiene el derecho, el orden de recorrido del subárbol derecho nodo raíz -> el nodo derecho -> el nodo izquierdo

BFS

Cola : cola utilizando el iterativo, ya que el árbol binario es una imagen de espejo, por lo que la cola en la que dos nodos consecutivos deben ser iguales, para lograr esta función, necesitamos elemento de la cola de carga, el primer nodo de la izquierda en el subárbol izquierdo, nodo derecho cargó entonces subárbol derecho, los nodos y el subárbol derecho nodo subárbol izquierda y derecha y la izquierda, el juicio final, cuando los dos nodos están vacías, entonces los satisface espejo las condiciones descritas, el bucle continúa para una imagen nodos, o cuando uno de los nodos está vacía, vuelve falsa, esta vez no se puede describir la configuración de espejo.

código fuente del programa

recursividad

/ * * 
 * Definición de un nodo de árbol binario. 
 * Estructura NodoArbol { 
 * int val; 
 * * NodoArbol la izquierda; 
 * * NodoArbol derecho; 
 * NodoArbol (int x): val (x), izquierda (NULL), derecho (NULL) {} 
 *}; 
 * / 
Clase de soluciones {
 público :
     bool isSymmetric (TreeNode * raíz) {
         si (raíz == nullptr) volver  verdadera ; // 判空
        retorno isMirror (Raíz> izquierda, Raíz> derecha); 
    } 
    Bool isMirror (TreeNode * izquierda, TreeNode * derecha) 
    { 
        si(&& nullptr a la izquierda == == nullptr un derecho) de retorno  a la verdadera ; // subárboles izquierdo y derecho están vacías, el retorno a la verdadera 
        SI (derecha == == nullptr a || nullptr a la izquierda) de retorno  en false ; // subárbol izquierdo hay una vaciar, falsa se devuelve 
        SI (izquierda -> Val = derecha> Val!) de retorno  en false ; // izquierda, y los subárboles derecho no son iguales, vuelve a falso 
        retorno isMirror (izquierda -> izquierda, derecha> derecha) && isMirror (izquierda - > derecha, derecha> izquierda); // tiempo de aproximadamente igual subárbol, los nodos comparar nodo en el subárbol izquierdo izquierda y derecha y subárbol derecho, los nodos y el subárbol nodo subárbol derecho a la izquierda y derecha y la izquierda 
    } 
};

montón

/ * * 
 * Definición de un nodo de árbol binario. 
 * Estructura NodoArbol { 
 * int val; 
 * * NodoArbol la izquierda; 
 * * NodoArbol derecho; 
 * NodoArbol (int x): val (x), izquierda (NULL), derecho (NULL) {} 
 *}; 
 * / 
Clase de soluciones {
 público :
     bool isSymmetric (TreeNode * raíz) {
         si (raíz == nullptr) volver  verdadera ; 
        pila <TreeNode *> S1, S2; 
        TreeNode * p = raíz; 
        TreeNode * q = raíz;
        mientras que (p! = nullptr ||!s1.empty ()) {
             el tiempo (P =! nullptr a) {
                 SI (Q || nullptr una p - ==> = Q-Val> Val)! retorno  a false ; // subárboles izquierdo y derecho de una o dos punteros a nula el valor de nodo actual no es igual 
                s1.push (P); 
                s2.push (Q); 
                P = p-> dejó; 
                Q = Q> derecha; 
            } 
            SI (Q = nullptr un!) de retorno  en false ; // P es vacía, q no está vacía, es decir, uno para los subárboles izquierdo y derecho vaciar 
            P = s1.top (); 
            s1.pop (); 
            q = s2.top (); 
            s2.pop (); 
            P= P-> derecho; 
            q = q-> izquierda; 
        } 
       Devolver  cierto ; 
    } 
};

cola

/ * * 
 * Definición de un nodo de árbol binario. 
 * Estructura NodoArbol { 
 * int val; 
 * * NodoArbol la izquierda; 
 * * NodoArbol derecho; 
 * NodoArbol (int x): val (x), izquierda (NULL), derecho (NULL) {} 
 *}; 
 * / 
Clase de soluciones {
 público :
     bool isSymmetric (TreeNode * raíz) {
         si (raíz == nullptr) volver  verdadera ; 
        cola <TreeNode *> Que; 
        que.push (raíz -> izquierda); 
        que.push (raíz -> derecha);
        mientras que (! que.empty ())
        { 
            TreeNode * p = que.front (); 
            que.pop (); 
            TreeNode * q = que.front (); 
            que.pop (); 
            si (p == nullptr && q == nullptr) continuar ;    
            si (p == nullptr || q == nullptr) retorno  falsa ;
            si (p> val = q-> val!) de retorno  falsa ; 
            que.push (p -> izquierda); 
            que.push (q -> derecha); 
            que.push (p -> derecha); 
            que.push (q -> izquierda);
        } 
        Devolver  cierto ; 
    } 
};

 

Supongo que te gusta

Origin www.cnblogs.com/wzw0625/p/12657538.html
Recomendado
Clasificación