本文用python3實現二叉查找樹的查找、插入、刪除操作。
完整代碼:https://github.com/toanoyx/BasicAlgorithm/tree/master/tree
查找
查找操作:先取根節點,如果它等於要查找的數那就返回。如果要查找的數比根節點的值小,就在左子樹中遞歸查找;如果要查找的數比根節點的值大,那就在右子樹中遞歸查找。
def search(self, data):
res = []
node = self.root
while node:
if data < node.val:
node = node.left
else:
if data == node.val:
res.append(node)
node = node.right
return res
插入
插入操作:從根節點開始,依次比較要插入的數據與節點的大小關係。如果插入的數據比節點的大,並且節點的右子樹爲空,就將數據直接插到右子節點的位置;如果右子樹不爲空,就在遞歸遍歷右子樹,查找插入位置。如果要插入的數據比節點的小,並且節點的左子樹爲空,就將數據直接插到左子樹的位置;如果左子樹不爲空,就再遞歸遍歷左子樹,查找插入位置。
def insert(self, data):
if self.root is None:
self.root = TreeNode(data)
else:
node = self.root
while node:
p = node
if data < node.val:
node = node.left
else:
node = node.right
new_node = TreeNode(data)
new_node.parent = p
if data < p.val:
p.left = new_node
else:
p.right = new_node
return True
刪除
刪除操作:分三種情況進行討論。
①要刪除的節點沒有子節點:直接將父結點中指向要刪除節點的指針置爲null。
②要刪除的節點只有一個子節點(只有左子節點或者右子節點):更新父節點中,指向要刪除節點的指針,讓它指向要刪除節點的子節點即可。
③要刪除的節點有兩個子節點:首先找到要刪除節點的右子樹中的最小節點,把它的值替換到要刪除的節點上。然後再刪除掉這個最小節點即可。
def _del(self, node):
# 1
if node.left is None and node.right is None:
if node == self.root:
self.root = None
else:
if node.val < node.parent.val:
node.parent.left = None
else:
node.parent.right = None
node.parent = None
# 2
elif node.left is None and node.right is not None:
if node == self.root:
self.root = node.right
self.root.parent = None
node.right = None
else:
if node.val < node.parent.val:
node.parent.left = node.right
else:
node.parent.right = node.right
node.right.parent = node.parent
node.parent = None
node.right = None
elif node.left is not None and node.right is None:
if node == self.root:
self.root = node.left
self.root.parent = None
node.left = None
else:
if node.val < node.parent.val:
node.parent.left = node.left
else:
node.parent.right = node.left
node.left.parent = node.parent
node.parent = None
node.left = None
# 3
else:
min_node = node.right
if min_node.left:
min_node = min_node.left
if node.val != min_node.val:
node.val = min_node.val
self._del(min_node)
else:
self._del(min_node)
self._del(node)