J'ai de la difficulté à comprendre les fonctions récursives impliquées dans la traversée de l'arbre de précommande, d'inorder et postorder. J'ai une certaine connaissance de la récursivité (mais il est vrai que ce n'est pas mon fort). Tous semblent s'appeler deux fois d'abord en faisant un appel avec l'enfant gauche de la racine et ensuite avec l'enfant droit. Mais comment est-ce possible? L'appel de la fonction preOrder avec l'enfant de gauche ne retournerait-il pas le flux de contrôle en haut, et l'appel suivant ne serait jamais exécuté?J'ai de la difficulté à comprendre les fonctions récursives de la traversée de l'arbre
void preOrder (Node* root)
{
if (root == NULL) return;
cout<<root->val<<", ";
preOrder(root->left);
preOrder(root->right);
}
1. N'appelez pas un noeud arbitraire 'root'. 2. Si vous testez * dans * une fonction pour un argument 'NULL', alors vous n'avez pas besoin de le tester * avant * l'appel récursif sur les pointeurs' left' et 'right'. Bien sûr, cela vous évite d'ignorer les appels des enfants des feuilles non-existantes, mais OTOH ajoute le temps de test sur tous les nœuds internes. – CiaPan
@CiaPan le test nul pour que le noeud retourne simplement si pour la possibilité la racine d'origine peut être vide. –
Je sais ce que c'est. Je viens de signaler que tester if (node-> left) 'avant' postorder (node-> left) 'est superflue, car la fonction le testera à nouveau après l'appel. – CiaPan