<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Terminale/Arbres binaires</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Définition d'un arbre binaire (nœuds, racine, feuilles,<br/>
sous-arbres), terminologie (hauteur, profondeur, taille),<br/>
parcours en profondeur (préfixe, infixe, postfixe) et en<br/>
largeur, propriétés des arbres équilibrés et complets,<br/>
applications.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q01 : Définition d'un arbre binaire</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un <strong>arbre binaire</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Vocabulaire : <strong>racine</strong> (sommet), <strong>nœud interne</strong><br/>
(au moins un enfant), <strong>feuille</strong> (aucun enfant),<br/>
<strong>sous-arbre</strong> (arbre formé par un nœud et ses<br/>
descendants). Cette définition est fondamentale.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre dont les nœuds contiennent uniquement deux valeurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : « binaire » fait référence au nombre<br/>
d'enfants, pas au nombre de valeurs par nœud.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une structure linéaire avec deux pointeurs par élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt une liste doublement<br/>
chaînée. Un arbre n'est pas linéaire mais<br/>
hiérarchique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre généalogique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre généalogique n'est pas<br/>
forcément binaire (chaque personne a au plus<br/>
deux parents directs, mais peut avoir plus de<br/>
deux enfants).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une structure hiérarchique où chaque nœud a au plus deux enfants (gauche et droit)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un arbre binaire est un cas<br/>
particulier d'arbre où chaque nœud a $0$, $1$ ou<br/>
$2$ enfants. La structure est récursive : chaque<br/>
enfant est lui-même la racine d'un arbre binaire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q02 : Racine</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Combien de <strong>racines</strong> un arbre binaire possède-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'unicité de la racine définit l'arbre. Si on a<br/>
plusieurs « racines », on parle plutôt d'une<br/>
<strong>forêt</strong> (ensemble disjoint d'arbres).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre non vide a toujours exactement<br/>
une racine. Seul l'arbre vide n'a pas de racine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Exactement une</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la racine est le sommet de<br/>
l'arbre, le nœud sans parent. Tout autre nœud<br/>
descend de la racine via une chaîne unique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cela dépend de la profondeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : non, peu importe la profondeur, il y a<br/>
toujours une seule racine.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Plusieurs, autant que de feuilles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : confusion entre racine et feuille. Un<br/>
arbre a une racine et plusieurs feuilles<br/>
(typiquement).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q03 : Feuille</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'une <strong>feuille</strong> dans un arbre binaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les feuilles sont importantes car elles marquent les<br/>
cas de base des algorithmes récursifs sur les arbres.<br/>
Un parcours s'arrête typiquement à chaque feuille.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La racine de l'arbre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la racine est au sommet, les feuilles<br/>
sont les nœuds <strong>terminaux</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un nœud à mi-hauteur de l'arbre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune définition de feuille basée sur<br/>
la hauteur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un nœud qui a exactement deux enfants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ça, c'est un nœud <strong>interne complet</strong>.<br/>
Une feuille n'a aucun enfant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un nœud qui n'a aucun enfant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une feuille est un nœud sans<br/>
descendant. Elle marque la fin d'une branche.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q04 : Hauteur d'un arbre</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on <strong>hauteur</strong> d'un arbre binaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variante : certaines conventions comptent en<br/>
<strong>nombre de nœuds</strong> plutôt que d'arêtes (la racine<br/>
seule a alors une hauteur de $1$). Préciser la<br/>
convention dans tout exercice.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distance entre deux feuilles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le diamètre, pas la hauteur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre de feuilles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de feuilles<br/>
renseigne sur la<br/>
capacité finale d'un<br/>
arbre, mais ne mesure<br/>
pas sa hauteur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La longueur du plus long chemin de la racine à une feuille (compté en nombre d'arêtes)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : convention courante. Un arbre<br/>
réduit à une racine a une hauteur de $0$. Un<br/>
arbre vide a souvent la convention de<br/>
hauteur $-1$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre total de nœuds</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la <strong>taille</strong>, pas la hauteur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q05 : Profondeur d'un nœud</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La <strong>profondeur</strong> d'un nœud dans un arbre est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La hauteur de l'arbre est égale à la profondeur<br/>
maximale (parmi tous les nœuds). Les deux notions<br/>
sont liées mais distinctes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre de feuilles sous ce nœud</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est encore une autre quantité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La longueur du chemin de la racine jusqu'à ce nœud</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la racine a une profondeur de<br/>
$0$, ses enfants $1$, etc. La profondeur est une<br/>
propriété du nœud, alors que la hauteur est une<br/>
propriété de l'arbre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre de ses descendants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt la <strong>taille du sous-arbre</strong><br/>
enraciné en ce nœud.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La distance jusqu'à sa feuille la plus proche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas la définition standard de<br/>
profondeur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q06 : Parcours préfixe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans un parcours <strong>préfixe</strong> (ou <em>pre-order</em>), dans<br/>
quel ordre visite-t-on les nœuds ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mnémotechnique : <strong>pré</strong>fixe = nœud d'<strong>abord</strong> ;<br/>
<strong>in</strong>fixe = nœud <strong>au milieu</strong> ; <strong>post</strong>fixe = nœud<br/>
<strong>après</strong>. Le « préfixe », « infixe », « postfixe »<br/>
réfère à la position du nœud dans la séquence des<br/>
visites.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Nœud, sous-arbre gauche, sous-arbre droit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : « préfixe » car on visite le nœud<br/>
<strong>avant</strong> ses enfants (préfixe = devant).<br/>
Utilisation typique : copier un arbre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sous-arbre droit, nœud, sous-arbre gauche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ordre inhabituel, ce n'est aucun des<br/>
parcours classiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sous-arbre gauche, nœud, sous-arbre droit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le parcours <strong>infixe</strong> (in-order).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sous-arbre gauche, sous-arbre droit, nœud</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le parcours <strong>postfixe</strong><br/>
(post-order).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q07 : Parcours infixe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans quel ordre s'effectue un parcours <strong>infixe</strong> d'un<br/>
arbre binaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sur un arbre binaire de recherche, le parcours<br/>
infixe parcourt les valeurs dans l'ordre. C'est la<br/>
raison principale d'utiliser cette structure pour<br/>
maintenir un ensemble trié dynamiquement.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Nœud, sous-arbre gauche, sous-arbre droit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le parcours <strong>préfixe</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sous-arbre gauche, sous-arbre droit, nœud</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le parcours <strong>postfixe</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Sous-arbre gauche, nœud, sous-arbre droit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on visite d'abord tout le<br/>
sous-arbre gauche, puis le nœud lui-même, puis le<br/>
sous-arbre droit. Ce parcours est très utile sur<br/>
un arbre binaire de recherche : il donne les<br/>
valeurs <strong>dans l'ordre<br/>
croissant</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toutes les feuilles d'abord, puis tous les nœuds internes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun parcours classique ne sépare<br/>
ainsi.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q08 : Parcours postfixe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le parcours <strong>postfixe</strong> visite :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Application : pour calculer la <strong>taille</strong> d'un arbre<br/>
ou sa <strong>hauteur</strong> récursivement, on a besoin des<br/>
résultats des sous-arbres avant le nœud courant,<br/>
c'est typiquement un parcours postfixe.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>D'abord le sous-arbre gauche, puis le sous-arbre droit, et enfin le nœud</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on visite le nœud <strong>après</strong> ses<br/>
enfants. Très utile pour libérer la mémoire d'un<br/>
arbre (ses feuilles d'abord) ou évaluer une<br/>
expression arithmétique en notation postfixée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement les feuilles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tous les nœuds sont visités, pas<br/>
seulement les feuilles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les nœuds dans un ordre aléatoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un parcours est déterministe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>D'abord le nœud, puis les enfants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le parcours préfixe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q09 : Parcours en largeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le parcours en <strong>largeur</strong> d'un arbre :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mémo : <strong>largeur = file</strong>, <strong>profondeur = pile</strong><br/>
(ou récursivité). Cette dualité est centrale dans<br/>
les algorithmes sur les graphes, dont les<br/>
parcours en largeur et en profondeur s'appuient<br/>
sur ces deux structures.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Visite la branche gauche en entier avant la droite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt un parcours en<br/>
<strong>profondeur</strong> orienté vers la gauche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Visite tous les nœuds à profondeur $0$, puis $1$, puis $2$, etc.</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on parcourt niveau par niveau,<br/>
de la racine vers les feuilles. Implémentation<br/>
standard : avec une <strong>file</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Visite uniquement les nœuds internes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : tous les nœuds sont visités.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Évalue une expression arithmétique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait plutôt un parcours postfixe.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q10 : Taille d'un arbre</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La <strong>taille</strong> d'un arbre binaire est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Relation utile : un arbre binaire de hauteur $h$ a<br/>
au plus $2^{h+1} - 1$ nœuds. C'est le nombre maximum,<br/>
atteint quand l'arbre est <strong>parfaitement équilibré</strong>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre d'arêtes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre à $n$ nœuds a exactement<br/>
$n - 1$ arêtes, donc ce n'est pas une mesure<br/>
indépendante.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La hauteur du plus long chemin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la <strong>hauteur</strong>, pas la taille.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le nombre total de nœuds</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la taille compte tous les nœuds<br/>
(internes et feuilles). Pour la calculer, un<br/>
parcours récursif suffit : $T(\text{vide}) = 0$ ;<br/>
$T(\text{nœud}) = 1 + T(\text{gauche}) + T(\text{droit})$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre de feuilles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est seulement une partie des nœuds.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q11 : Implémentation Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une implémentation simple d'un nœud d'arbre binaire en<br/>
Python utilise :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention : un sous-arbre vide est représenté par<br/>
<code>None</code>. Cela simplifie la récursivité, le cas de<br/>
base est <code>if noeud is None: return ...</code>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une chaîne de caractères</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas adapté à une structure récursive.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire avec une clé entière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : possible mais pas idiomatique. Une<br/>
classe dédiée est plus claire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une liste de longueur fixe <code>[valeur, gauche, droite]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : possible, mais peu lisible. Une classe<br/>
dédiée est plus claire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une classe avec trois attributs (<code>valeur</code>, <code>gauche</code>, <code>droit</code>), où <code>gauche</code> et <code>droit</code> sont soit <code>None</code> soit un autre nœud</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'approche orientée objet<br/>
standard. Exemple :</p>
<pre><code>class Noeud:
    def __init__(self, v, g=None, d=None):
        self.valeur = v
        self.gauche = g
        self.droit = d</code></pre>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q12 : Calcul récursif de la hauteur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle fonction Python calcule correctement la hauteur<br/>
d'un arbre binaire (en nombre d'arêtes, $-1$ pour l'arbre<br/>
vide) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention alternative : compter en <strong>nombre de<br/>
nœuds</strong> sur le chemin (cas vide → $0$). Adapter<br/>
l'arithmétique en conséquence ($\max + 1$ devient<br/>
$\max$ ou différent).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def h(n):
    return n.gauche + n.droit</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on additionne des nœuds, ça n'a pas de<br/>
sens.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def h(n):
    if n is None: return 0
    return 1 + h(n.gauche) + h(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on <strong>somme</strong> les hauteurs, ce qui est<br/>
incorrect. Il faut prendre le <strong>maximum</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def h(n):
    return len(n)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>len</code> ne s'applique pas à un objet<br/>
arbitraire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def h(n):
    if n is None: return -1
    return 1 + max(h(n.gauche), h(n.droit))</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on prend la profondeur maximale<br/>
des deux sous-arbres et on ajoute $1$ (pour<br/>
l'arête vers ce nœud). Convention : arbre vide<br/>
de hauteur $-1$, racine seule de hauteur $0$.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q13 : Arbre équilibré</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'un arbre binaire <strong>équilibré</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sans équilibrage, un arbre peut dégénérer en<br/>
« peigne » (chaque nœud a un seul enfant) avec<br/>
hauteur $n$ et opérations en $O(n)$. Les arbres<br/>
AVL et rouge-noir sont des structures<br/>
auto-équilibrantes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre où tous les nœuds ont exactement deux enfants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un arbre <strong>complet</strong> ou <strong>plein</strong>,<br/>
pas équilibré.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre symétrique (gauche et droite identiques)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre équilibré n'est pas<br/>
forcément symétrique. La symétrie est une<br/>
contrainte plus forte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un arbre où, pour chaque nœud, les hauteurs des sous-arbres gauche et droit diffèrent au plus de $1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la définition de<br/>
l'équilibre AVL. Un arbre équilibré garantit une<br/>
hauteur $O(\log n)$, ce qui rend les opérations<br/>
de recherche, insertion, suppression rapides.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un arbre où la racine est au centre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la racine est au sommet, pas au centre.<br/>
La notion d'« équilibre » est plus précise.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q14 : Code de parcours préfixe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle fonction Python affiche les valeurs d'un arbre<br/>
binaire en parcours <strong>préfixe</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le seul changement entre les trois parcours en<br/>
profondeur est la <strong>position</strong> du <code>print</code> par rapport<br/>
aux deux appels récursifs. Très instructif à<br/>
observer.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def parcours(n):
    if n is None: return
    print(n.valeur)
    parcours(n.gauche)
    parcours(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on imprime le nœud <strong>avant</strong> ses<br/>
enfants : c'est la définition même du parcours<br/>
préfixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours(n):
    print(n.valeur)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ne descend pas dans les sous-arbres.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours(n):
    if n is None: return
    parcours(n.gauche)
    parcours(n.droit)
    print(n.valeur)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est un parcours <strong>postfixe</strong> (nœud<br/>
après les enfants).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def parcours(n):
    if n is None: return
    parcours(n.gauche)
    print(n.valeur)
    parcours(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le parcours <strong>infixe</strong>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q15 : Arbre complet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un arbre binaire est dit <strong>complet</strong> quand :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette structure est utilisée dans les <strong>tas binaires</strong><br/>
(priority queues), où l'arbre complet est représenté<br/>
en tableau pour économiser la mémoire et garantir<br/>
une complexité $O(\log n)$ des opérations.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il contient au moins une feuille</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trivialement vrai pour tout arbre non<br/>
vide. Pas une définition utile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toutes les feuilles sont à la même profondeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est plutôt un arbre <strong>parfait</strong>, plus<br/>
strict.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Tous les niveaux sont entièrement remplis, sauf éventuellement le dernier qui est rempli de gauche à droite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la propriété qui permet<br/>
d'implémenter un arbre complet par un <strong>tableau</strong><br/>
(sans pointeurs), avec la convention que pour le<br/>
nœud à l'index $i$, ses enfants sont aux indices<br/>
$2i+1$ et $2i+2$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La racine a un enfant gauche et un enfant droit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trop faible. Un arbre complet exige bien<br/>
plus.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q16 : Nombre de feuilles</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour un arbre binaire <strong>plein</strong> (chaque nœud interne a<br/>
exactement deux enfants), si $f$ est le nombre de<br/>
feuilles et $i$ le nombre de nœuds internes, quelle<br/>
relation a-t-on ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette relation s'utilise pour des comptages<br/>
d'arbres dans les exercices. Elle vient d'une<br/>
symétrie structurelle : chaque nœud interne « remplace<br/>
» une feuille par lui-même plus deux nouvelles<br/>
feuilles (delta de $+1$ feuille, $+1$ interne).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune relation déterministe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il existe bien une relation pour les<br/>
arbres pleins.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$f = i + 1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : par récurrence sur la taille.<br/>
Cas de base : un seul nœud (racine = feuille),<br/>
$f = 1, i = 0$. Pour un arbre plus grand, chaque<br/>
nouveau nœud interne ajoute une feuille (en<br/>
remplaçant un fils null par un sous-arbre).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$f = i$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la relation est différente. On peut<br/>
montrer $f = i + 1$ par récurrence.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$f = 2 \cdot i$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ne se vérifie pas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q17 : Implémenter un parcours en largeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour implémenter un parcours en largeur d'un arbre<br/>
binaire en Python, on utilise généralement :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Code typique :</p>
<pre><code>from collections import deque
def bfs(racine):
    if racine is None: return
    f = deque([racine])
    while f:
        n = f.popleft()
        print(n.valeur)
        if n.gauche: f.append(n.gauche)
        if n.droit:  f.append(n.droit)</code></pre>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une file (<code>collections.deque</code> avec <code>append</code> et <code>popleft</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on enfile la racine, puis tant<br/>
que la file n'est pas vide on défile le nœud<br/>
courant et on enfile ses deux enfants. Le file<br/>
assure le traitement niveau par niveau.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une variable simple</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : insuffisant pour stocker plusieurs<br/>
nœuds en attente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une pile (<code>list</code> avec <code>append</code> et <code>pop</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la pile correspond au parcours en<br/>
<strong>profondeur</strong>. Pour la largeur, c'est différent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire trié</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas adapté.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q18 : Borne du nombre de nœuds</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le nombre <strong>maximum</strong> de nœuds d'un arbre<br/>
binaire de hauteur $h$ ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Conséquence : pour avoir $n$ nœuds dans un arbre<br/>
équilibré, la hauteur est de l'ordre de $\log_2 n$.<br/>
C'est ce qui rend les arbres de recherche si<br/>
efficaces : opérations en $O(\log n)$.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$h + 1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le nombre <strong>minimum</strong> (arbre en<br/>
peigne).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$h^2$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la croissance n'est pas polynomiale<br/>
mais exponentielle (en hauteur).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$h$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un arbre dégénéré (peigne) a déjà $h+1$<br/>
nœuds. Et un arbre équilibré en a beaucoup plus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$2^{h+1} - 1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un arbre <strong>parfait</strong> de hauteur<br/>
$h$ a $1 + 2 + 4 + \ldots + 2^h = 2^{h+1} - 1$<br/>
nœuds. C'est le maximum atteignable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q19 : Évaluation d'expression arithmétique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour évaluer une expression arithmétique représentée<br/>
par un arbre (les feuilles sont des nombres, les nœuds<br/>
internes des opérateurs), on utilise un parcours :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'arbre d'expression de <code>(2 + 3) <em> 4</code> a <code></em></code> à la<br/>
racine, avec sous-arbre gauche <code>+</code> (de fils $2$ et<br/>
$3$) et sous-arbre droit feuille $4$. Évaluation<br/>
postfixe : $2 + 3 = 5$, puis $5 \times 4 = 20$.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Postfixe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on évalue d'abord les sous-arbres<br/>
gauche et droit (récursivement), puis on<br/>
applique l'opérateur du nœud courant. C'est<br/>
exactement la sémantique de l'arithmétique<br/>
mathématique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Infixe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'infixe affiche dans l'ordre lisible<br/>
humain, mais on a besoin d'évaluer les<br/>
sous-arbres avant le nœud, ce qui est postfixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aléatoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'évaluation doit suivre un ordre<br/>
précis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Préfixe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un parcours préfixe affiche d'abord<br/>
l'opérateur, donc on n'a pas encore les valeurs<br/>
au moment du calcul.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q20 : Arbre miroir</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour calculer le <strong>miroir</strong> d'un arbre binaire<br/>
(échanger gauche et droite à chaque nœud), une approche<br/>
récursive est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est un exemple typique d'algorithme récursif<br/>
simple sur arbre. La récursion est naturelle car la<br/>
structure est elle-même récursive.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Échanger uniquement la racine avec la dernière feuille</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas suffisant. Il faut le faire à<br/>
<strong>chaque</strong> nœud, récursivement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour chaque nœud, échanger ses deux sous-arbres puis appliquer récursivement le miroir aux sous-arbres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on inverse à tous les niveaux.<br/>
En Python :</p>
<pre><code>def miroir(n):
    if n is None: return
    n.gauche, n.droit = n.droit, n.gauche
    miroir(n.gauche)
    miroir(n.droit)</code></pre>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Ne rien faire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ne donne pas le miroir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier les éléments par ordre décroissant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec le tri.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q21 : Complexité de la recherche</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans un arbre binaire <strong>non ordonné</strong> de $n$ nœuds, la<br/>
recherche d'une valeur a une complexité au pire de :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est précisément la motivation des <strong>arbres<br/>
binaires de recherche</strong>, qui en ajoutant la<br/>
propriété d'ordre, ramènent la recherche à<br/>
$O(\log n)$ en moyenne (et $O(\log n)$ garanti si<br/>
équilibré).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(\log n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait dans un arbre <strong>ordonné</strong><br/>
équilibré (arbre binaire de recherche<br/>
équilibré). Sans ordre, on doit<br/>
parcourir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$O(n)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sans propriété d'ordre, on doit<br/>
potentiellement visiter tous les nœuds. Aucun<br/>
gain par rapport à une liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(n^2)$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : excessif. Une simple parcours visite<br/>
chaque nœud une fois, donc $O(n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$O(\sqrt{n})$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune raison particulière.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q22 : Reconstruction d'arbre</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Connaissant à la fois le parcours <strong>préfixe</strong> et le<br/>
parcours <strong>infixe</strong> d'un arbre binaire (sans valeurs<br/>
dupliquées), peut-on reconstruire l'arbre de manière<br/>
unique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Question classique d'examens. Le couple<br/>
(préfixe, infixe) ou (postfixe, infixe) suffit. Le<br/>
couple (préfixe, postfixe) ne suffit pas en général.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Seulement si l'arbre est équilibré</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune contrainte d'équilibrage<br/>
requise.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, il y a toujours plusieurs arbres possibles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ces deux parcours combinés permettent<br/>
en réalité une reconstruction unique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui, c'est un théorème classique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le préfixe donne la racine en<br/>
premier, l'infixe sépare les éléments à gauche<br/>
et à droite de la racine. On reconstruit<br/>
récursivement. Le préfixe seul ne suffit pas<br/>
(deux arbres peuvent avoir le même préfixe).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Cela dépend de la profondeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : non, le théorème vaut pour toute<br/>
profondeur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q23 : Diamètre d'un arbre</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le <strong>diamètre</strong> d'un arbre binaire est :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Calcul classique : pour chaque nœud, calculer la<br/>
profondeur de ses sous-arbres gauche et droit. Le<br/>
diamètre passant par ce nœud est leur somme + $2$<br/>
(les deux arêtes vers les sous-arbres). Le diamètre<br/>
global est le maximum sur tous les nœuds.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La hauteur de l'arbre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la hauteur part de la racine. Le<br/>
diamètre peut ne pas la passer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre total de nœuds</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la <strong>taille</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre total de feuilles</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de feuilles<br/>
n'est pas une distance<br/>
dans l'arbre. Le diamètre<br/>
mesure la longueur d'un<br/>
chemin, pas un comptage<br/>
de nœuds.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La longueur du plus long chemin entre deux nœuds (pas forcément passant par la racine)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est une notion plus subtile<br/>
que la hauteur. Le diamètre peut traverser<br/>
l'arbre via la racine ou rester dans un<br/>
sous-arbre. Calcul en $O(n)$ par parcours<br/>
récursif intelligent.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q24 : Représentation par tableau</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quand peut-on représenter efficacement un arbre binaire<br/>
dans un <strong>tableau</strong> (sans pointeurs) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette représentation est utilisée dans les <strong>tas<br/>
binaires</strong> (heaps), qui sont des arbres complets<br/>
ordonnés par priorité. Avantages : pas de<br/>
pointeurs, données contiguës, cache CPU efficace.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Quand l'arbre est complet (tous les niveaux remplis sauf éventuellement le dernier rempli de gauche à droite)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la représentation par tableau est<br/>
compacte uniquement si l'arbre est complet. À la<br/>
racine on stocke en index $0$ (ou $1$), pour le<br/>
nœud à l'index $i$ les enfants sont en $2i+1$ et<br/>
$2i+2$, et le parent en $(i-1)/2$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Quand l'arbre a moins de $10$ nœuds</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de seuil de taille, mais une<br/>
condition structurelle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours, c'est universel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour un arbre quelconque (avec des<br/>
« trous »), on gaspillerait beaucoup de mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Jamais, c'est inefficace</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est au contraire très efficace pour<br/>
les arbres complets (tas binaires).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q25 : Cas d'usage des arbres binaires</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Lequel des cas suivants utilise typiquement un arbre<br/>
binaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Autres usages : analyse syntaxique (arbres de<br/>
syntaxe abstraite), systèmes de fichiers (chaque<br/>
dossier est un nœud), arbres de jeux (échecs, go),<br/>
structures de regroupement hiérarchique. Les arbres<br/>
sont omniprésents en informatique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Stocker une liste de courses ordinaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une liste plate suffit. Pas besoin<br/>
d'arbre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Échanger deux variables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'échange de deux variables<br/>
se fait avec une variable<br/>
temporaire (ou une affectation<br/>
multiple en Python). Cela n'a<br/>
aucun lien avec une structure<br/>
arborescente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compter le nombre de mots dans un texte</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pour compter des mots,<br/>
un simple compteur entier<br/>
suffit. Un arbre serait<br/>
totalement disproportionné<br/>
pour cette tâche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Représenter un arbre de décision, une expression arithmétique, ou un index ordonné dynamique (arbre binaire de recherche)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ces cas exploitent la nature<br/>
hiérarchique et/ou récursive de l'arbre.<br/>
Particulièrement utile quand on veut maintenir<br/>
un ensemble trié avec insertion/suppression<br/>
dynamiques.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q26 : Calcul récursif de la taille</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle fonction Python calcule correctement la<br/>
<strong>taille</strong> (nombre total de nœuds) d'un arbre<br/>
binaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette structure de récursion (cas de base<br/>
<code>None</code> → $0$, cas récursif $1 + $ somme des<br/>
sous-arbres) est l'archétype de l'algorithme<br/>
récursif sur arbre binaire. Elle s'adapte à<br/>
d'autres mesures (somme des valeurs, produit,<br/>
maximum, etc.) en changeant la combinaison.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def taille(n):
    if n is None:
        return 0
    return 1 + max(taille(n.gauche), taille(n.droit))</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on prend ici le <strong>maximum</strong> au lieu de<br/>
la <strong>somme</strong>. Le résultat correspond à la<br/>
hauteur (en nombre de nœuds), pas à la taille.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def taille(n):
    if n is None:
        return 0
    return 1 + taille(n.gauche) + taille(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on additionne $1$ (pour le nœud<br/>
courant) à la somme des tailles des deux<br/>
sous-arbres. Le cas de base est l'arbre vide,<br/>
de taille $0$. Récursion classique sur la<br/>
structure d'arbre, en $O(n)$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def taille(n):
    if n is None:
        return 1
    return taille(n.gauche) + taille(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on compte les <strong>feuilles vides</strong><br/>
(<code>None</code>) au lieu des nœuds. La taille d'un<br/>
arbre à un seul nœud serait $2$ au lieu de<br/>
$1$, ce qui est faux.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def taille(n):
    return 1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on renvoie toujours $1$, sans<br/>
parcourir l'arbre. Pour tout arbre, la<br/>
fonction renverrait $1$, ce qui n'est pas la<br/>
taille (sauf cas trivial d'un seul nœud).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q27 : Compter les feuilles</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle fonction Python compte correctement le<br/>
nombre de <strong>feuilles</strong> d'un arbre binaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas particulier dans le code : on doit reconnaître<br/>
explicitement les feuilles avec<br/>
<code>n.gauche is None and n.droit is None</code>. C'est une<br/>
différence importante par rapport à la fonction<br/>
<code>taille</code>, qui se contente d'additionner sans<br/>
distinguer les feuilles.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def feuilles(n):
    if n is None:
        return 1
    return feuilles(n.gauche) + feuilles(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on compte les positions vides<br/>
(<code>None</code>), ce qui donne le double du nombre de<br/>
feuilles plus quelque chose pour les nœuds à<br/>
un seul enfant. Pas la bonne mesure.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def feuilles(n):
    if n is None:
        return 0
    return feuilles(n.gauche) + feuilles(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque le cas où le nœud est une<br/>
feuille. Cette fonction renverrait toujours<br/>
$0$ car on ne compte jamais. Récursion<br/>
stérile.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def feuilles(n):
    if n is None:
        return 0
    return 1 + feuilles(n.gauche) + feuilles(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ajoute $1$ pour <strong>chaque</strong> nœud,<br/>
ce qui compte la <strong>taille totale</strong> de l'arbre,<br/>
pas seulement les feuilles. Il faut distinguer<br/>
les feuilles (sans enfant) des nœuds internes<br/>
(au moins un enfant).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def feuilles(n):
    if n is None:
        return 0
    if n.gauche is None and n.droit is None:
        return 1
    return feuilles(n.gauche) + feuilles(n.droit)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trois cas. (1) Arbre vide :<br/>
aucune feuille. (2) Nœud sans enfant : une<br/>
feuille. (3) Nœud interne : on additionne les<br/>
feuilles des deux sous-arbres. C'est le<br/>
patron classique de comptage récursif.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Arbres binaires — Q28 : Profondeur d'un nœud</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment calculer la <strong>profondeur</strong> d'un nœud<br/>
contenant la valeur <code>cible</code> dans un arbre binaire<br/>
(ou <code>-1</code> si la valeur n'est pas présente) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variante intéressante : utiliser un parcours en<br/>
largeur avec une file qui contient les couples<br/>
<code>(nœud, profondeur)</code>. Permet d'éviter la<br/>
récursion. Complexité dans les deux cas :<br/>
<code>O(n)</code> au pire, où <code>n</code> est le nombre de nœuds.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def profondeur(n, cible):
    return n.valeur - cible</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur grossière : on calcule une différence<br/>
de valeurs, ce qui n'a aucun rapport avec une<br/>
profondeur dans un arbre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def profondeur(n, cible):
    if n.valeur == cible:
        return 0
    return 1 + profondeur(n.gauche, cible)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne descend que dans le sous-arbre<br/>
<strong>gauche</strong>, et on plante si on atteint un<br/>
nœud <code>None</code> sans avoir trouvé la cible.<br/>
L'arbre ne se réduit pas à sa branche gauche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def profondeur(n, cible):
    if n is None:
        return 0
    if n.valeur == cible:
        return 1
    return profondeur(n.gauche, cible) + profondeur(n.droit, cible)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on <strong>additionne</strong> les résultats des<br/>
deux sous-arbres, ce qui n'a pas de sens pour<br/>
une profondeur. De plus, on ne propage pas<br/>
le compteur de profondeur, donc on ne peut<br/>
pas savoir à quelle distance se trouve la<br/>
cible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def profondeur(n, cible, p=0):
    if n is None:
        return -1
    if n.valeur == cible:
        return p
    g = profondeur(n.gauche, cible, p + 1)
    if g != -1:
        return g
    return profondeur(n.droit, cible, p + 1)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on transmet la profondeur<br/>
courante via le paramètre <code>p</code>, qu'on incrémente<br/>
à chaque descente récursive. On retourne <code>p</code><br/>
dès que la cible est trouvée. Si la recherche<br/>
dans le sous-arbre gauche échoue (<code>-1</code>), on<br/>
essaie le droit. Sinon on remonte <code>-1</code> (cible<br/>
absente).</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
