14 from __future__
import print_function
17 VERSION =
'bintree --- 2010 March 16'
33 PARENTSLEFT = (
'(',
'[',
'{')
36 PARENTSRIGHT = (
')',
']',
'}')
40 PARENTSLEFT_TEX = (
r'\left(',
r'\left[',
r'\left{')
43 PARENTSRIGHT_TEX = (
r'\right)',
r'\right]',
r'\right}')
55 """Arbre binaire générique"""
59 """Compare self et value
61 Pre: les éventuelles racines de self et value doivent être comparables par cmp()
66 raise NotImplementedError
71 """Efface la racine (si elle existe)
80 """Efface le sous-arbre binaire de gauche (si il existe)
89 """Efface le sous-arbre binaire de droite (si il existe)
98 """Renvoie True si l'arbre binaire est vide
99 (c.-à-d. si ni racine,
100 ni sous-arbre de gauche, ni sous-arbre de droite),
111 """Renvoie self == value
113 Pre: les éventuelles racines de self et value doivent être comparables par ==
118 raise NotImplementedError
119 return (isinstance(value, Bintree)
128 Pre: self: Bintree possédant une racine
140 """Renvoie le sous-arbre binaire de gauche
142 Pre: self: Bintree possédant un sous-arbre binaire de gauche
154 """Renvoie le sous-arbre binaire de droite
156 Pre: self: Bintree possédant un sous-arbre binaire de droite
168 """Renvoie True si l'arbre binaire possède une racine,
174 return hasattr(self,
'_e')
179 """Renvoie True si l'arbre binaire possède un sous-arbre binaire de gauche,
185 return hasattr(self,
'_l')
190 """Renvoie True si l'arbre binaire possède un sous-arbre binaire de droite,
196 return hasattr(self,
'_r')
202 Bintree() : arbre binaire vide
203 Bintree(value) : arbre binaire avec value pour racine
204 Bintree(value, left) : arbre binaire avec value pour racine
205 et left pour sous-arbre binaire de gauche
206 Bintree(value, left, right) : arbre binaire avec value pour racine
207 et left pour sous-arbre binaire de gauche
208 et right pour sous-arbre binaire de droite
213 ou (Object, Bintree, Bintree)
216 assert len(args) <= 3, (len(args), args)
224 assert isinstance(args[1], Bintree), type(args[1])
228 assert isinstance(args[2], Bintree), type(args[2])
235 """Renvoie le nombre de noeuds
250 """Renvoie self != value
255 return not(self == value)
260 """Renvoie l'arbre binaire sous forme de string
261 (à partir d'un parcours préfixe)
262 (renvoie '(()())' si l'arbre binaire est vide)
279 """Vide l'arbre binaire
280 (c.-à-d. efface la racine,
281 le sous-arbre de gauche et le sous-arbre de droite)
291 """Fixe la valeur de la racine à value
299 """Fixe le sous-arbre binaire de gauche à value
304 assert isinstance(value, Bintree), type(value)
311 """Fixe le sous-arbre binaire de droite à value
316 assert isinstance(value, Bintree), type(value)
323 """Renvoie l'arbre binaire sous forme de string
324 (à partir d'un parcours préfixe)
325 (renvoie '(()())' si l'arbre binaire est vide)
346 """Exécute t.__delroot__()"""
352 """Exécute t.__delsubleft__()"""
358 """Exécute t.__delsubright__()"""
364 """Renvoie t.__empty__()"""
370 """Renvoie t.__getroot__()"""
371 return t.__getroot__()
376 """Renvoie t.__getsubleft__()"""
377 return t.__getsubleft__()
382 """Renvoie t.__getsubright__()"""
383 return t.__getsubright__()
388 """Renvoie t.__hasroot__()"""
389 return t.__hasroot__()
394 """Renvoie t.__hassubleft__()"""
395 return t.__hassubleft__()
400 """Renvoie t.__hassubright__()"""
401 return t.__hassubright__()
406 """Exécute t.__setempty__()"""
412 """Exécute t.__setroot__(value)"""
418 """Exécute t.__setsubleft__(value)"""
419 t.__setsubleft__(value)
424 """Exécute t.__setsubright__(value)"""
425 t.__setsubright__(value)
432 if __name__ ==
'__main__':
439 debug.test_begin(VERSION, __debug__)
441 print(
'PARENTSLEFT == {0}'.format(PARENTSLEFT)); sys.stdout.flush()
442 assert isinstance(PARENTSLEFT, tuple)
443 print(
'PARENTSRIGHT == {0}'.format(PARENTSRIGHT)); sys.stdout.flush()
444 assert isinstance(PARENTSRIGHT, tuple)
446 print(
'PARENTSLEFT_TEX == {0}'.format(PARENTSLEFT_TEX)); sys.stdout.flush()
447 assert isinstance(PARENTSLEFT_TEX, tuple)
448 print(
'PARENTSRIGHT_TEX == {0}'.format(PARENTSRIGHT_TEX)); sys.stdout.flush()
449 assert isinstance(PARENTSRIGHT_TEX, tuple)
454 print(
'Bintree()...', end=
''); sys.stdout.flush()
467 print(
'ok'); sys.stdout.flush()
470 print(
'Bintree.__cmp__()...', end=
''); sys.stdout.flush()
472 print(
'ok'); sys.stdout.flush()
475 print(
'Bintree.__delroot__()...', end=
''); sys.stdout.flush()
477 print(
'ok'); sys.stdout.flush()
480 print(
'Bintree.__delsubleft__()...', end=
''); sys.stdout.flush()
482 print(
'ok'); sys.stdout.flush()
485 print(
'Bintree.__delsubright__()...', end=
''); sys.stdout.flush()
487 print(
'ok'); sys.stdout.flush()
490 print(
'Bintree.__empty__()...', end=
''); sys.stdout.flush()
491 assert t.__empty__(), t
492 assert not t1.__empty__(), t1
493 assert not t2.__empty__(), t2
494 assert not t3.__empty__(), t3
495 assert not t4.__empty__(), t4
497 assert not t3n.__empty__(), t3n
499 print(
'ok'); sys.stdout.flush()
502 print(
'Bintree.__eq__()...', end=
''); sys.stdout.flush()
504 print(
'ok'); sys.stdout.flush()
507 print(
'Bintree.__getroot__()...', end=
''); sys.stdout.flush()
509 print(
'ok'); sys.stdout.flush()
512 print(
'Bintree.__getsubleft__()...', end=
''); sys.stdout.flush()
514 print(
'ok'); sys.stdout.flush()
517 print(
'Bintree.__getsubright__()...', end=
''); sys.stdout.flush()
519 print(
'ok'); sys.stdout.flush()
522 print(
'Bintree.__hasroot__()...', end=
''); sys.stdout.flush()
524 print(
'ok'); sys.stdout.flush()
527 print(
'Bintree.__hassubleft__()...', end=
''); sys.stdout.flush()
529 print(
'ok'); sys.stdout.flush()
532 print(
'Bintree.__hassubright__()...', end=
''); sys.stdout.flush()
534 print(
'ok'); sys.stdout.flush()
537 print(
'Bintree.__len__()...', end=
''); sys.stdout.flush()
538 assert len(t) == 0, (len(t), t)
539 assert len(t1) == 1, (len(t1), t1)
540 assert len(t2) == 1, (len(t2), t2)
541 assert len(t3) == 2, (len(t3), t3)
542 assert len(t4) == 4, (len(t4), t4)
544 assert len(t3n) == 7, (len(t3n), t3n)
546 print(
'ok'); sys.stdout.flush()
549 print(
'Bintree.__ne__()...', end=
''); sys.stdout.flush()
551 print(
'ok'); sys.stdout.flush()
554 print(
'Bintree.__repr__()...', end=
''); sys.stdout.flush()
556 print(
'ok'); sys.stdout.flush()
559 print(
'Bintree.__setempty__()...', end=
''); sys.stdout.flush()
560 assert t.__empty__(), t
562 assert t.__empty__(), t
564 print(
'ok'); sys.stdout.flush()
567 print(
'Bintree.__setroot__()...', end=
''); sys.stdout.flush()
569 print(
'ok'); sys.stdout.flush()
572 print(
'Bintree.__setsubleft__()...', end=
''); sys.stdout.flush()
574 print(
'ok'); sys.stdout.flush()
577 print(
'Bintree.__setsubright__()...', end=
''); sys.stdout.flush()
579 print(
'ok'); sys.stdout.flush()
582 print(
'Bintree.__str__()...', end=
''); sys.stdout.flush()
583 assert str(t) ==
'(()())', str(t)
584 assert str(t1) ==
'(1()())', str(t1)
585 assert str(t2) ==
'(2(()())())', str(t2)
586 assert str(t3) ==
'(3(1()())())', str(t3)
587 assert str(t4) ==
'(4(2(()())())(3(1()())()))', str(t4)
589 assert str(t3n) ==
'(/(+(*(3()())(n()()))(1()()))(2()()))', str(t3n)
591 print(
'ok'); sys.stdout.flush()
596 print(
'delroot()...', end=
''); sys.stdout.flush()
598 print(
'ok'); sys.stdout.flush()
601 print(
'delsubleft()...', end=
''); sys.stdout.flush()
603 print(
'ok'); sys.stdout.flush()
606 print(
'delsubright()...', end=
''); sys.stdout.flush()
608 print(
'ok'); sys.stdout.flush()
611 print(
'empty()...', end=
''); sys.stdout.flush()
613 assert not empty(t1), t1
614 assert not empty(t2), t2
615 assert not empty(t3), t3
616 assert not empty(t4), t4
618 assert not empty(t3n), t3n
620 print(
'ok'); sys.stdout.flush()
623 print(
'getroot()...', end=
''); sys.stdout.flush()
625 print(
'ok'); sys.stdout.flush()
628 print(
'getsubleft()...', end=
''); sys.stdout.flush()
630 print(
'ok'); sys.stdout.flush()
633 print(
'getsubright()...', end=
''); sys.stdout.flush()
635 print(
'ok'); sys.stdout.flush()
638 print(
'hasroot()...', end=
''); sys.stdout.flush()
640 print(
'ok'); sys.stdout.flush()
643 print(
'hassubleft()...', end=
''); sys.stdout.flush()
645 print(
'ok'); sys.stdout.flush()
648 print(
'hassubright()...', end=
''); sys.stdout.flush()
650 print(
'ok'); sys.stdout.flush()
653 print(
'setempty()...', end=
''); sys.stdout.flush()
655 print(
'ok'); sys.stdout.flush()
658 print(
'setroot()...', end=
''); sys.stdout.flush()
660 print(
'ok'); sys.stdout.flush()
663 print(
'setsubleft()...', end=
''); sys.stdout.flush()
665 print(
'ok'); sys.stdout.flush()
668 print(
'setsubright()...', end=
''); sys.stdout.flush()
670 print(
'ok'); sys.stdout.flush()