Voici la description du problème:processus derrière la pensée de déterminer si l'arbre binaire est symétrique
Compte tenu d'un arbre binaire, vérifier si elle est un miroir de lui-même (c.-à-symétrique autour de son centre).
Par exemple, cet arbre binaire [1,2,2,3,4,4,3] est symétrique:
1
/\
2 2
/\/\
3 4 4 3
Mais les [1,2,2, null, 3, null , 3] n'est pas:
1
/\
2 2
\ \
3 3
provenant: Determine if tree is symmetric
J'ai pris beaucoup de temps pour résoudre le problème et la solution, je suis venu avec était de faire une traversée de commande de niveau et vérifier que les valeurs dans chaque niveau sont un palindrome. Cette implémentation a passé les tests sur leetcode. Cependant, quand j'ai lu l'éditorial, j'ai vu un programme récursif extrêmement court et j'ai eu du mal à comprendre.
public boolean isSymmetric(TreeNode root) {
return isMirror(root, root); }
public boolean isMirror(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val)
&& isMirror(t1.right, t2.left)
&& isMirror(t1.left, t2.right);}
- Comment peut-on prouver l'exactitude de la version récursive ci-dessus? (Je suppose que cela peut être prouvé inductivement?)
- Quelqu'un peut-il esquisser le processus de pensée en trouvant une telle solution. Est-ce que vous vérifiez la solution en visualisant réellement la pile d'appels ou y a-t-il un bon cadre de réflexion de haut niveau pour raisonner sur de tels problèmes?
Je comprends que l'arbre est une structure de données récursive en elle-même dire composé de sous-arbre gauche et à droite qui suivent la même structure, mais pour une raison quelconque lorsque je tente de vérifier la validité de cette solution, je tente de visualiser les appels récursifs et finalement mes pensées s'emmêlent. This guy a fait un bon travail pour expliquer comment la pile d'appels se déroule alors que la récursivité se poursuit, mais je voulais juste améliorer mon processus de réflexion pour de tels problèmes récursifs "faciles" et donc poster ici.
(FWIW, je connais récursion/DFS/retours en arrière et comment le flux d'appels est mais je suis coincé à venir et de valider l'idée récurrente de haut niveau pour le problème ci-dessus)
Merci pour aider.
Merci à thebenman pour la visualisation de la pile d'appel. Après avoir vu la solution, je pouvais la retracer, mais cela aiderait à trouver une façon de raisonner sur l'exactitude de l'algorithme sans le simuler. Dans ce sens, sauriez-vous comment la version récursive peut être prouvée correcte? –