二叉排序树怎么构造和删除
在计算机科学和数据结构中,二叉排序树(Binary Search Tree,BST)是一种二叉树,其中每个节点具有一个键值,键值满足以下要求:左子树中的所有键值小于它,右子树中的所有键值都大于它。二叉排序树支持快速的插入,查找和删除操作,因此在实际应用中广泛使用。本文将从多个角度介绍如何构造和删除二叉排序树。
1. 构造二叉排序树
构造二叉排序树,最简单的方法是将元素一个一个插入到树中。首先,我们将第一个元素插入到树的根节点中。接下来,每当插入一个新元素,我们将它与根节点作比较,如果它小于根节点,则将其插入到左子树中,否则插入到右子树中。如此重复下去,直到没有更多元素可以插入为止。下面是构造二叉排序树的示例代码:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def insert(root, val):
if root is None:
return TreeNode(val)
if val < root.val:
root.left = insert(root.left, val)
else:
root.right = insert(root.right, val)
return root
```
2. 删除二叉排序树中的节点
删除二叉排序树中的节点时,我们需要考虑三种情况:该节点没有子节点,该节点有一个子节点和该节点有两个子节点。如果该节点没有子节点,我们只需要将其父节点指向 None 即可。如果该节点有一个子节点,我们将该节点的父节点指向该节点的子节点。如果该节点有两个子节点,我们需要找到该节点的中序遍历的后继节点来取代该节点。下面是删除二叉排序树中节点的示例代码:
```python
def delete(root, val):
if root is None:
return root
if val < root.val:
root.left = delete(root.left, val)
elif val > root.val:
root.right = delete(root.right, val)
else:
if root.left is None:
temp = root.right
root = None
return temp
elif root.right is None:
temp = root.left
root = None
return temp
temp = find_min(root.right)
root.val = temp.val
root.right = delete(root.right, temp.val)
return root
def find_min(root):
while root.left is not None:
root = root.left
return root
```
3. 时间复杂度和空间复杂度
在构造二叉排序树的过程中,每个元素都需要和树中的节点进行比较,因此构造时间复杂度为 O(nlogn)。而在删除节点时,我们需要查找该节点的后继节点,因此删除时间复杂度也为 O(nlogn)。在空间复杂度上,由于每个节点都需要存储其值和左右子节点的指针,因此空间复杂度为 O(n)。