1414>>> t.insert(8, 3, 6, 1, 10, 14, 13, 4, 7)
1515>>> print(" ".join(repr(i.value) for i in t.traversal_tree()))
16168 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)))
18281 4 7 6 3 13 14 10 8
1929>>> t.remove(20)
3949Test existence
4050>>> t.search(6) is not None
4151True
52+ >>> 6 in t
53+ True
4254>>> t.search(-1) is not None
4355False
56+ >>> -1 in t
57+ False
4458
4559>>> t.search(6).is_right
4660True
4963
5064>>> t.get_max().value
516514
66+ >>> max(t)
67+ 14
5268>>> t.get_min().value
53691
70+ >>> min(t)
71+ 1
5472>>> t.empty()
5573False
74+ >>> not t
75+ False
5676>>> for i in testlist:
5777... t.remove(i)
5878>>> t.empty()
5979True
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
6387from typing import Any
6488
6589
90+ @dataclass
6691class 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
85121class 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+
230281def postorder (curr_node : Node | None ) -> list [Node ]:
231282 """
232283 postOrder (left, right, self)
0 commit comments