Skip to content

Commit 8b401c2

Browse files
committed
fix format error
1 parent 9eac127 commit 8b401c2

File tree

9 files changed

+249
-364
lines changed

9 files changed

+249
-364
lines changed

codes/python/chapter_tree/avl_tree.py

+49-110
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,46 @@
1+
"""
2+
File: avl_tree.py
3+
Created Time: 2022-12-20
4+
Author: a16su ([email protected])
5+
"""
6+
17
import sys, os.path as osp
28
import typing
39

410
sys.path.append(osp.dirname(osp.dirname(osp.abspath(__file__))))
511
from include import *
612

713

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-
3014
class AVLTree:
31-
def __init__(self, root: typing.Optional[AVLTreeNode] = None):
15+
def __init__(self, root: typing.Optional[TreeNode] = None):
3216
self.root = root
3317

34-
@staticmethod
35-
def height(node: typing.Optional[AVLTreeNode]) -> int:
36-
"""
37-
获取结点高度
38-
Args:
39-
node:起始结点
40-
41-
Returns: 高度 or -1
18+
""" 获取结点高度 """
4219

43-
"""
20+
def height(self, node: typing.Optional[TreeNode]) -> int:
4421
# 空结点高度为 -1 ,叶结点高度为 0
4522
if node is not None:
4623
return node.height
4724
return -1
4825

49-
def __update_height(self, node: AVLTreeNode):
50-
"""
51-
更新结点高度
52-
Args:
53-
node: 要更新高度的结点
26+
""" 更新结点高度 """
5427

55-
Returns: None
56-
57-
"""
28+
def __update_height(self, node: TreeNode):
5829
# 结点高度等于最高子树高度 + 1
5930
node.height = max([self.height(node.left), self.height(node.right)]) + 1
6031

61-
def balance_factor(self, node: AVLTreeNode) -> int:
62-
"""
63-
获取结点平衡因子
64-
Args:
65-
node: 要获取平衡因子的结点
66-
67-
Returns: 平衡因子
32+
""" 获取平衡因子 """
6833

69-
"""
34+
def balance_factor(self, node: TreeNode) -> int:
7035
# 空结点平衡因子为 0
7136
if node is None:
7237
return 0
7338
# 结点平衡因子 = 左子树高度 - 右子树高度
7439
return self.height(node.left) - self.height(node.right)
7540

76-
def __right_rotate(self, node: AVLTreeNode) -> AVLTreeNode:
41+
""" 右旋操作 """
42+
43+
def __right_rotate(self, node: TreeNode) -> TreeNode:
7744
child = node.left
7845
grand_child = child.right
7946
# 以 child 为原点,将 node 向右旋转
@@ -85,7 +52,9 @@ def __right_rotate(self, node: AVLTreeNode) -> AVLTreeNode:
8552
# 返回旋转后子树的根节点
8653
return child
8754

88-
def __left_rotate(self, node: AVLTreeNode) -> AVLTreeNode:
55+
""" 左旋操作 """
56+
57+
def __left_rotate(self, node: TreeNode) -> TreeNode:
8958
child = node.right
9059
grand_child = child.left
9160
# 以 child 为原点,将 node 向左旋转
@@ -97,15 +66,9 @@ def __left_rotate(self, node: AVLTreeNode) -> AVLTreeNode:
9766
# 返回旋转后子树的根节点
9867
return child
9968

100-
def rotate(self, node: AVLTreeNode):
101-
"""
102-
执行旋转操作,使该子树重新恢复平衡
103-
Args:
104-
node: 要旋转的根结点
69+
""" 执行旋转操作,使该子树重新恢复平衡 """
10570

106-
Returns: 旋转后的根结点
107-
108-
"""
71+
def __rotate(self, node: TreeNode) -> TreeNode:
10972
# 获取结点 node 的平衡因子
11073
balance_factor = self.balance_factor(node)
11174
# 左偏树
@@ -129,76 +92,46 @@ def rotate(self, node: AVLTreeNode):
12992
# 平衡树,无需旋转,直接返回
13093
return node
13194

132-
def insert(self, val) -> AVLTreeNode:
133-
"""
134-
插入结点
135-
Args:
136-
val: 结点的值
95+
""" 插入结点 """
13796

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)
14299
return self.root
143100

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+
""" 递归插入结点(辅助函数)"""
154102

155-
"""
103+
def __insert_helper(self, node: typing.Optional[TreeNode], val: int) -> TreeNode:
156104
if node is None:
157-
return AVLTreeNode(val)
105+
return TreeNode(val)
158106
# 1. 查找插入位置,并插入结点
159107
if val < node.val:
160-
node.left = self.insert_helper(node.left, val)
108+
node.left = self.__insert_helper(node.left, val)
161109
elif val > node.val:
162-
node.right = self.insert_helper(node.right, val)
110+
node.right = self.__insert_helper(node.right, val)
163111
else:
164112
# 重复结点不插入,直接返回
165113
return node
166114
# 更新结点高度
167115
self.__update_height(node)
168116
# 2. 执行旋转操作,使该子树重新恢复平衡
169-
return self.rotate(node)
170-
171-
def remove(self, val: int):
172-
"""
173-
删除结点
174-
Args:
175-
val: 要删除的结点的值
117+
return self.__rotate(node)
176118

177-
Returns:
119+
""" 删除结点 """
178120

179-
"""
180-
root = self.remove_helper(self.root, val)
121+
def remove(self, val: int):
122+
root = self.__remove_helper(self.root, val)
181123
return root
182124

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+
""" 递归删除结点(辅助函数) """
193126

194-
"""
127+
def __remove_helper(self, node: typing.Optional[TreeNode], val: int) -> typing.Optional[TreeNode]:
195128
if node is None:
196129
return None
197130
# 1. 查找结点,并删除之
198131
if val < node.val:
199-
node.left = self.remove_helper(node.left, val)
132+
node.left = self.__remove_helper(node.left, val)
200133
elif val > node.val:
201-
node.right = self.remove_helper(node.right, val)
134+
node.right = self.__remove_helper(node.right, val)
202135
else:
203136
if node.left is None or node.right is None:
204137
child = node.left or node.right
@@ -210,33 +143,39 @@ def remove_helper(
210143
node = child
211144
else: # 子结点数量 = 2 ,则将中序遍历的下个结点删除,并用该结点替换当前结点
212145
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)
214147
node.val = temp.val
215148
# 更新结点高度
216149
self.__update_height(node)
217150
# 2. 执行旋转操作,使该子树重新恢复平衡
218-
return self.rotate(node)
151+
return self.__rotate(node)
219152

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]:
224156
if node is None:
225157
return None
226158
# 循环访问左子结点,直到叶结点时为最小结点,跳出
227159
while node.left is not None:
228160
node = node.left
229161
return node
230162

163+
""" 查找结点 """
164+
231165
def search(self, val: int):
232166
cur = self.root
167+
# 循环查找,越过叶结点后跳出
233168
while cur is not None:
169+
# 目标结点在 root 的右子树中
234170
if cur.val < val:
235171
cur = cur.right
172+
# 目标结点在 root 的左子树中
236173
elif cur.val > val:
237174
cur = cur.left
175+
# 找到目标结点,跳出循环
238176
else:
239177
break
178+
# 返回目标结点
240179
return cur
241180

242181

0 commit comments

Comments
 (0)