Skip to content

Commit 78fe5bb

Browse files
authored
Update skew_heap.py
1 parent 0febfb5 commit 78fe5bb

File tree

1 file changed

+33
-17
lines changed

1 file changed

+33
-17
lines changed

data_structures/heap/skew_heap.py

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77

88

99
class Comparable(Protocol):
10-
def __lt__(self, other: Any) -> bool: ...
11-
def __gt__(self, other: Any) -> bool: ...
10+
def __lt__(self: T, other: T) -> bool: ...
1211

1312

1413
T = TypeVar("T", bound=Comparable)
@@ -60,24 +59,40 @@ def value(self) -> T:
6059
TypeError: SkewNode.__init__() missing 1 required positional argument: 'value'
6160
"""
6261
return self._value
63-
6462
@staticmethod
65-
def merge(
66-
root1: SkewNode[T] | None, root2: SkewNode[T] | None
67-
) -> SkewNode[T] | None:
63+
def merge(root1: SkewNode[T] | None, root2: SkewNode[T] | None) -> SkewNode[T] | None:
64+
"""
65+
Merge 2 nodes together.
66+
>>> SkewNode.merge(SkewNode(10), SkewNode(-10.5)).value
67+
-10.5
68+
>>> SkewNode.merge(SkewNode(10), SkewNode(10.5)).value
69+
10
70+
>>> SkewNode.merge(SkewNode(10), SkewNode(10)).value
71+
10
72+
>>> SkewNode.merge(SkewNode(-100), SkewNode(-10.5)).value
73+
-100
74+
"""
6875
if not root1:
6976
return root2
77+
7078
if not root2:
7179
return root1
7280

73-
if root2.value < root1.value:
74-
root1, root2 = root2, root1
75-
76-
result = root1
77-
temp = root1.right
78-
result.right = root1.left
79-
result.left = SkewNode.merge(temp, root2)
80-
return result
81+
# 使用类型安全的比较方式
82+
if root1.value < root2.value:
83+
# root1 更小,不需要交换
84+
result = root1
85+
temp = root1.right
86+
result.right = root1.left
87+
result.left = SkewNode.merge(temp, root2)
88+
return result
89+
else:
90+
# root2 更小或相等,需要交换
91+
result = root2
92+
temp = root2.right
93+
result.right = root2.left
94+
result.left = SkewNode.merge(root1, temp)
95+
return result
8196

8297

8398
class SkewHeap[T]:
@@ -182,9 +197,10 @@ def pop(self) -> T:
182197
IndexError: Can't get top element for the empty heap.
183198
"""
184199
result = self.top()
185-
self._root = (
186-
SkewNode.merge(self._root.left, self._root.right) if self._root else None
187-
)
200+
if self._root:
201+
self._root = SkewNode.merge(self._root.left, self._root.right)
202+
else:
203+
self._root = None
188204

189205
return result
190206

0 commit comments

Comments
 (0)