Je voudrais une fonction swap x y t qui, dans l'arbre t, échange le noeud x avec ses descendants de valeur y.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 type tree = | Leaf | Node of tree * int * tree
Par exemple à partir de cet arbre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 let t = Node(Node(Node(Leaf,7,Leaf),1,Node(Leaf,4,Leaf)), 5, Node(Node(Leaf,6,Leaf),3,Node(Leaf,2,Leaf)));; swap 5 6 t;;
Voici ma fonction swap, mais je la trouve trop naïve car elle copie la totalité de l'arbre.
Dans mon cas d'utilisation le noeud x n'a toujours qu'un seul descendant de valeur y.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 let swap x y t = let rec infix1 = function | Leaf -> Leaf | Node(l,a,r) -> if a = x then Node(infix2 l,y,infix2 r) else Node(infix1 l,a,infix1 r) and infix2 = function | Leaf -> Leaf | Node(l,a,r) -> Node(infix2 l,(if a = y then x else a),infix2 r) in infix1 t;;
Comment écrire swap x y t de façon a ce qu'elle ne copie qu'un chemin depuis la racine au lieu de la totalité de l'arbre ?
Partager