árbol binario? Simetría!
Título:
Dado un árbol binario, comprobar si es simétrica
Ejemplos:
binario [1,2,2,3,4,4,3] simétrico
- 1.
- / - \
-2 ---- 2
- / - \ - / - \
34--43
tema de análisis
- simétrico binario
aproximadamente 1. subárboles ==> la misma configuración que
los subárboles izquierdo y derecho 2 ==> correspondiente a la misma ubicación de lo digital
Binaria simétrica ==> la misma izquierda y derecha subárboles
Para el actualraíz
subárbol izquierdo de la izquierda subárbol derecho subárbol derecho subárbol mismo
subárbol derecho del subárbol izquierdo del subárbol izquierdo subárbol derecho de la misma
que
recursividad! !
La determinación de si cada nodo es el mismo para los subárboles izquierdo y derecho
Ideas de resolución de problemas
función | efecto |
---|---|
juez (TreeNode a, TreeNode b) | Determinar si los mismos dos árbol binario |
proceso:
-
Dos árboles de raíces diferentes valores
==> false retorno -
La raíz de dos árboles sin haber izquierda y derecha subárboles (descrito recorrido recursivo a un nodo hoja)
==> retorno a la verdadera -
Dos árboles de raíz de los subárboles izquierdo y derecho están presentes
==>
subárbol derecho del subárbol izquierdo - subárbol derecho del subárbol izquierdo misma
misma subárbol derecho subárbol derecho - subárbol izquierdo del subárbol izquierdo
== > vuelta verdad -
Dos árboles de raíz de la estructura subárbol izquierda y derecha no se corresponde
==>
la presencia de un subárbol izquierdo del árbol y el otro árbol justo ausencia subárbol
y la presencia de otro árbol tiene un subárbol derecho del árbol subárbol izquierdo no existe
==> false retorno -
Raíz de dos árboles a la izquierda y derecha subárboles están presentes, pero sin correspondencia estructural
==>
presencia dejó subárbol de un árbol a otro subárbol derecho árbol correspondiente a la presencia de
la presencia de un árbol a otro subárbol derecho del árbol correspondiente a la presencia del subárbol izquierdo
==> recursivamente determina si el correspondiente subárbol de la misma
Código es el siguiente
bool judge(TreeNode*a,TreeNode*b)
{
if(a->val != b->val) return false;
if(!a->right && !b->left && !a->left && !b->right) return true; //递归遍历到叶子结点
if(a->right && b->left&&a->left && b->right)
{
return (judge(a->right, b->left)&&judge(a->left, b->right));
}
if((a->right==NULL&& b->left)||(a->right&& b->left ==NULL) ||(a->left==NULL&& b->right)
||(a->left&& b->right ==NULL) ) return false; //a b树子树结构不对应
if (a->right && b->left ) return judge(a->right, b->left); //a树的右子树且b树的左子树存在
if (a->left && b->right) return judge(a->left, b->right); //a树的左子树且b树的右子树存在
return false;
}
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
if(!root -> left && !root -> right) return true;
if(root -> left && root -> right)
return judge(root->left, root->right);
else return false;
}
};