Skip to content

Commit 88f1401

Browse files
cclausssedatguzelsemme
authored andcommitted
Add dataclasses to binary_search_tree.py (TheAlgorithms#10920)
1 parent 662288a commit 88f1401

File tree

1 file changed

+60
-9
lines changed

1 file changed

+60
-9
lines changed

data_structures/binary_tree/binary_search_tree.py

+60-9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@
1414
>>> t.insert(8, 3, 6, 1, 10, 14, 13, 4, 7)
1515
>>> print(" ".join(repr(i.value) for i in t.traversal_tree()))
1616
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+
1727
>>> print(" ".join(repr(i.value) for i in t.traversal_tree(postorder)))
1828
1 4 7 6 3 13 14 10 8
1929
>>> t.remove(20)
@@ -39,8 +49,12 @@
3949
Test existence
4050
>>> t.search(6) is not None
4151
True
52+
>>> 6 in t
53+
True
4254
>>> t.search(-1) is not None
4355
False
56+
>>> -1 in t
57+
False
4458
4559
>>> t.search(6).is_right
4660
True
@@ -49,26 +63,47 @@
4963
5064
>>> t.get_max().value
5165
14
66+
>>> max(t)
67+
14
5268
>>> t.get_min().value
5369
1
70+
>>> min(t)
71+
1
5472
>>> t.empty()
5573
False
74+
>>> not t
75+
False
5676
>>> for i in testlist:
5777
... t.remove(i)
5878
>>> t.empty()
5979
True
80+
>>> not t
81+
True
6082
"""
83+
from __future__ import annotations
6184

62-
from collections.abc import Iterable
85+
from collections.abc import Iterable, Iterator
86+
from dataclasses import dataclass
6387
from typing import Any
6488

6589

90+
@dataclass
6691
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 []
72107

73108
def __repr__(self) -> str:
74109
from pprint import pformat
@@ -79,12 +114,18 @@ def __repr__(self) -> str:
79114

80115
@property
81116
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)
83118

84119

120+
@dataclass
85121
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 []
88129

89130
def __str__(self) -> str:
90131
"""
@@ -227,6 +268,16 @@ def find_kth_smallest(self, k: int, node: Node) -> int:
227268
return arr[k - 1]
228269

229270

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+
230281
def postorder(curr_node: Node | None) -> list[Node]:
231282
"""
232283
postOrder (left, right, self)

0 commit comments

Comments
 (0)