1
+ """
2
+ File: avl_tree.py
3
+ Created Time: 2022-12-20
4
+
5
+ """
6
+
1
7
import sys , os .path as osp
2
8
import typing
3
9
4
10
sys .path .append (osp .dirname (osp .dirname (osp .abspath (__file__ ))))
5
11
from include import *
6
12
7
13
8
- class AVLTreeNode :
9
- def __init__ (
10
- self ,
11
- val = None ,
12
- height : int = 0 ,
13
- left : typing .Optional ["AVLTreeNode" ] = None ,
14
- right : typing .Optional ["AVLTreeNode" ] = None ,
15
- ):
16
- self .val = val
17
- self .height = height
18
- self .left = left
19
- self .right = right
20
-
21
- def __str__ (self ):
22
- val = self .val
23
- left_val = self .left .val if self .left else None
24
- right_val = self .right .val if self .right else None
25
- return "<AVLTreeNode: {}, leftAVLTreeNode: {}, rightAVLTreeNode: {}>" .format (
26
- val , left_val , right_val
27
- )
28
-
29
-
30
14
class AVLTree :
31
- def __init__ (self , root : typing .Optional [AVLTreeNode ] = None ):
15
+ def __init__ (self , root : typing .Optional [TreeNode ] = None ):
32
16
self .root = root
33
17
34
- @staticmethod
35
- def height (node : typing .Optional [AVLTreeNode ]) -> int :
36
- """
37
- 获取结点高度
38
- Args:
39
- node:起始结点
40
-
41
- Returns: 高度 or -1
18
+ """ 获取结点高度 """
42
19
43
- """
20
+ def height ( self , node : typing . Optional [ TreeNode ]) -> int :
44
21
# 空结点高度为 -1 ,叶结点高度为 0
45
22
if node is not None :
46
23
return node .height
47
24
return - 1
48
25
49
- def __update_height (self , node : AVLTreeNode ):
50
- """
51
- 更新结点高度
52
- Args:
53
- node: 要更新高度的结点
26
+ """ 更新结点高度 """
54
27
55
- Returns: None
56
-
57
- """
28
+ def __update_height (self , node : TreeNode ):
58
29
# 结点高度等于最高子树高度 + 1
59
30
node .height = max ([self .height (node .left ), self .height (node .right )]) + 1
60
31
61
- def balance_factor (self , node : AVLTreeNode ) -> int :
62
- """
63
- 获取结点平衡因子
64
- Args:
65
- node: 要获取平衡因子的结点
66
-
67
- Returns: 平衡因子
32
+ """ 获取平衡因子 """
68
33
69
- """
34
+ def balance_factor ( self , node : TreeNode ) -> int :
70
35
# 空结点平衡因子为 0
71
36
if node is None :
72
37
return 0
73
38
# 结点平衡因子 = 左子树高度 - 右子树高度
74
39
return self .height (node .left ) - self .height (node .right )
75
40
76
- def __right_rotate (self , node : AVLTreeNode ) -> AVLTreeNode :
41
+ """ 右旋操作 """
42
+
43
+ def __right_rotate (self , node : TreeNode ) -> TreeNode :
77
44
child = node .left
78
45
grand_child = child .right
79
46
# 以 child 为原点,将 node 向右旋转
@@ -85,7 +52,9 @@ def __right_rotate(self, node: AVLTreeNode) -> AVLTreeNode:
85
52
# 返回旋转后子树的根节点
86
53
return child
87
54
88
- def __left_rotate (self , node : AVLTreeNode ) -> AVLTreeNode :
55
+ """ 左旋操作 """
56
+
57
+ def __left_rotate (self , node : TreeNode ) -> TreeNode :
89
58
child = node .right
90
59
grand_child = child .left
91
60
# 以 child 为原点,将 node 向左旋转
@@ -97,15 +66,9 @@ def __left_rotate(self, node: AVLTreeNode) -> AVLTreeNode:
97
66
# 返回旋转后子树的根节点
98
67
return child
99
68
100
- def rotate (self , node : AVLTreeNode ):
101
- """
102
- 执行旋转操作,使该子树重新恢复平衡
103
- Args:
104
- node: 要旋转的根结点
69
+ """ 执行旋转操作,使该子树重新恢复平衡 """
105
70
106
- Returns: 旋转后的根结点
107
-
108
- """
71
+ def __rotate (self , node : TreeNode ) -> TreeNode :
109
72
# 获取结点 node 的平衡因子
110
73
balance_factor = self .balance_factor (node )
111
74
# 左偏树
@@ -129,76 +92,46 @@ def rotate(self, node: AVLTreeNode):
129
92
# 平衡树,无需旋转,直接返回
130
93
return node
131
94
132
- def insert (self , val ) -> AVLTreeNode :
133
- """
134
- 插入结点
135
- Args:
136
- val: 结点的值
95
+ """ 插入结点 """
137
96
138
- Returns:
139
- node: 插入结点后的根结点
140
- """
141
- self .root = self .insert_helper (self .root , val )
97
+ def insert (self , val ) -> TreeNode :
98
+ self .root = self .__insert_helper (self .root , val )
142
99
return self .root
143
100
144
- def insert_helper (
145
- self , node : typing .Optional [AVLTreeNode ], val : int
146
- ) -> AVLTreeNode :
147
- """
148
- 递归插入结点(辅助函数)
149
- Args:
150
- node: 要插入的根结点
151
- val: 要插入的结点的值
152
-
153
- Returns: 插入结点后的根结点
101
+ """ 递归插入结点(辅助函数)"""
154
102
155
- """
103
+ def __insert_helper ( self , node : typing . Optional [ TreeNode ], val : int ) -> TreeNode :
156
104
if node is None :
157
- return AVLTreeNode (val )
105
+ return TreeNode (val )
158
106
# 1. 查找插入位置,并插入结点
159
107
if val < node .val :
160
- node .left = self .insert_helper (node .left , val )
108
+ node .left = self .__insert_helper (node .left , val )
161
109
elif val > node .val :
162
- node .right = self .insert_helper (node .right , val )
110
+ node .right = self .__insert_helper (node .right , val )
163
111
else :
164
112
# 重复结点不插入,直接返回
165
113
return node
166
114
# 更新结点高度
167
115
self .__update_height (node )
168
116
# 2. 执行旋转操作,使该子树重新恢复平衡
169
- return self .rotate (node )
170
-
171
- def remove (self , val : int ):
172
- """
173
- 删除结点
174
- Args:
175
- val: 要删除的结点的值
117
+ return self .__rotate (node )
176
118
177
- Returns:
119
+ """ 删除结点 """
178
120
179
- """
180
- root = self .remove_helper (self .root , val )
121
+ def remove ( self , val : int ):
122
+ root = self .__remove_helper (self .root , val )
181
123
return root
182
124
183
- def remove_helper (
184
- self , node : typing .Optional [AVLTreeNode ], val : int
185
- ) -> typing .Optional [AVLTreeNode ]:
186
- """
187
- 递归删除结点(辅助函数)
188
- Args:
189
- node: 删除的起始结点
190
- val: 要删除的结点的值
191
-
192
- Returns: 删除目标结点后的起始结点
125
+ """ 递归删除结点(辅助函数) """
193
126
194
- """
127
+ def __remove_helper ( self , node : typing . Optional [ TreeNode ], val : int ) -> typing . Optional [ TreeNode ]:
195
128
if node is None :
196
129
return None
197
130
# 1. 查找结点,并删除之
198
131
if val < node .val :
199
- node .left = self .remove_helper (node .left , val )
132
+ node .left = self .__remove_helper (node .left , val )
200
133
elif val > node .val :
201
- node .right = self .remove_helper (node .right , val )
134
+ node .right = self .__remove_helper (node .right , val )
202
135
else :
203
136
if node .left is None or node .right is None :
204
137
child = node .left or node .right
@@ -210,33 +143,39 @@ def remove_helper(
210
143
node = child
211
144
else : # 子结点数量 = 2 ,则将中序遍历的下个结点删除,并用该结点替换当前结点
212
145
temp = self .min_node (node .right )
213
- node .right = self .remove_helper (node .right , temp .val )
146
+ node .right = self .__remove_helper (node .right , temp .val )
214
147
node .val = temp .val
215
148
# 更新结点高度
216
149
self .__update_height (node )
217
150
# 2. 执行旋转操作,使该子树重新恢复平衡
218
- return self .rotate (node )
151
+ return self .__rotate (node )
219
152
220
- def min_node (
221
- self , node : typing .Optional [AVLTreeNode ]
222
- ) -> typing .Optional [AVLTreeNode ]:
223
- # 获取最小结点
153
+ """ 获取最小结点 """
154
+
155
+ def min_node (self , node : typing .Optional [TreeNode ]) -> typing .Optional [TreeNode ]:
224
156
if node is None :
225
157
return None
226
158
# 循环访问左子结点,直到叶结点时为最小结点,跳出
227
159
while node .left is not None :
228
160
node = node .left
229
161
return node
230
162
163
+ """ 查找结点 """
164
+
231
165
def search (self , val : int ):
232
166
cur = self .root
167
+ # 循环查找,越过叶结点后跳出
233
168
while cur is not None :
169
+ # 目标结点在 root 的右子树中
234
170
if cur .val < val :
235
171
cur = cur .right
172
+ # 目标结点在 root 的左子树中
236
173
elif cur .val > val :
237
174
cur = cur .left
175
+ # 找到目标结点,跳出循环
238
176
else :
239
177
break
178
+ # 返回目标结点
240
179
return cur
241
180
242
181
0 commit comments