14
14
>>> t.insert(8, 3, 6, 1, 10, 14, 13, 4, 7)
15
15
>>> print(" ".join(repr(i.value) for i in t.traversal_tree()))
16
16
8 3 1 6 4 7 10 14 13
17
+
18
+ >>> tuple(i.value for i in t.traversal_tree(inorder))
19
+ (1, 3, 4, 6, 7, 8, 10, 13, 14)
20
+ >>> tuple(t)
21
+ (1, 3, 4, 6, 7, 8, 10, 13, 14)
22
+ >>> t.find_kth_smallest(3, t.root)
23
+ 4
24
+ >>> tuple(t)[3-1]
25
+ 4
26
+
17
27
>>> print(" ".join(repr(i.value) for i in t.traversal_tree(postorder)))
18
28
1 4 7 6 3 13 14 10 8
19
29
>>> t.remove(20)
39
49
Test existence
40
50
>>> t.search(6) is not None
41
51
True
52
+ >>> 6 in t
53
+ True
42
54
>>> t.search(-1) is not None
43
55
False
56
+ >>> -1 in t
57
+ False
44
58
45
59
>>> t.search(6).is_right
46
60
True
49
63
50
64
>>> t.get_max().value
51
65
14
66
+ >>> max(t)
67
+ 14
52
68
>>> t.get_min().value
53
69
1
70
+ >>> min(t)
71
+ 1
54
72
>>> t.empty()
55
73
False
74
+ >>> not t
75
+ False
56
76
>>> for i in testlist:
57
77
... t.remove(i)
58
78
>>> t.empty()
59
79
True
80
+ >>> not t
81
+ True
60
82
"""
83
+ from __future__ import annotations
61
84
62
- from collections .abc import Iterable
85
+ from collections .abc import Iterable , Iterator
86
+ from dataclasses import dataclass
63
87
from typing import Any
64
88
65
89
90
+ @dataclass
66
91
class Node :
67
- def __init__ (self , value : int | None = None ):
68
- self .value = value
69
- self .parent : Node | None = None # Added in order to delete a node easier
70
- self .left : Node | None = None
71
- self .right : Node | None = None
92
+ value : int
93
+ left : Node | None = None
94
+ right : Node | None = None
95
+ parent : Node | None = None # Added in order to delete a node easier
96
+
97
+ def __iter__ (self ) -> Iterator [int ]:
98
+ """
99
+ >>> list(Node(0))
100
+ [0]
101
+ >>> list(Node(0, Node(-1), Node(1), None))
102
+ [-1, 0, 1]
103
+ """
104
+ yield from self .left or []
105
+ yield self .value
106
+ yield from self .right or []
72
107
73
108
def __repr__ (self ) -> str :
74
109
from pprint import pformat
@@ -79,12 +114,18 @@ def __repr__(self) -> str:
79
114
80
115
@property
81
116
def is_right (self ) -> bool :
82
- return self .parent is not None and self is self .parent .right
117
+ return bool ( self .parent and self is self .parent .right )
83
118
84
119
120
+ @dataclass
85
121
class BinarySearchTree :
86
- def __init__ (self , root : Node | None = None ):
87
- self .root = root
122
+ root : Node | None = None
123
+
124
+ def __bool__ (self ) -> bool :
125
+ return bool (self .root )
126
+
127
+ def __iter__ (self ) -> Iterator [int ]:
128
+ yield from self .root or []
88
129
89
130
def __str__ (self ) -> str :
90
131
"""
@@ -227,6 +268,16 @@ def find_kth_smallest(self, k: int, node: Node) -> int:
227
268
return arr [k - 1 ]
228
269
229
270
271
+ def inorder (curr_node : Node | None ) -> list [Node ]:
272
+ """
273
+ inorder (left, self, right)
274
+ """
275
+ node_list = []
276
+ if curr_node is not None :
277
+ node_list = inorder (curr_node .left ) + [curr_node ] + inorder (curr_node .right )
278
+ return node_list
279
+
280
+
230
281
def postorder (curr_node : Node | None ) -> list [Node ]:
231
282
"""
232
283
postOrder (left, right, self)
0 commit comments