Skip to content

Commit 99b61c4

Browse files
Merge pull request wangzheng0822#147 from jerryderry/binary-search-tree-python
binary search tree in python
2 parents 5ebfdc9 + 273a25c commit 99b61c4

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
"""
2+
Binary search tree
3+
4+
Author: Wenru Dong
5+
"""
6+
from typing import Optional
7+
8+
class TreeNode:
9+
def __init__(self, value: int):
10+
self.val = value
11+
self.left = None
12+
self.right = None
13+
14+
class BinarySearchTree:
15+
def __init__(self):
16+
self._root = None
17+
18+
def find(self, value: int) -> Optional[TreeNode]:
19+
node = self._root
20+
while node and node.val != value:
21+
node = node.left if node.val > value else node.right
22+
return node
23+
24+
def insert(self, value: int):
25+
if not self._root:
26+
self._root = TreeNode(value)
27+
return
28+
parent = None
29+
node = self._root
30+
while node:
31+
parent = node
32+
node = node.left if node.val > value else node.right
33+
new_node = TreeNode(value)
34+
if parent.val > value:
35+
parent.left = new_node
36+
else:
37+
parent.right = new_node
38+
39+
def delete(self, value: int):
40+
node = self._root
41+
parent = None
42+
while node and node.val != value:
43+
parent = node
44+
node = node.left if node.val > value else node.right
45+
if not node: return
46+
47+
# 要删除的节点有两个子节点
48+
if node.left and node.right:
49+
successor = node.right
50+
successor_parent = node
51+
while successor.left:
52+
successor_parent = successor
53+
successor = successor.left
54+
node.val = successor.val
55+
parent, node = successor_parent, successor
56+
57+
# 删除节点是叶子节点或者仅有一个子节点
58+
child = node.left if node.left else node.right
59+
if not parent:
60+
self._root = child
61+
elif parent.left == node:
62+
parent.left = child
63+
else:
64+
parent.right = child

0 commit comments

Comments
 (0)