二叉手搜索树
二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree)。
二叉搜索树
是具有有以下性质的二叉树:
- 若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值。
- 若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值。
- 左、右子树也分别为二叉搜索树。
from typing import List
class TreeNode:
def __init__(self, val: int):
self.val = val
self.left = None
self.right = None
class BST:
def __init__(self):
self.root = None
def insert(self, val: int):
if self.root is None:
self.root = TreeNode(val)
return
self._insert_node(self.root, val)
def _insert_node(self, root: TreeNode, val: int):
if val <= root.val:
if root.left is None:
root.left = TreeNode(val)
else:
self._insert_node(root.left, val)
else:
if root.right is None:
root.right = TreeNode(val)
else:
self._insert_node(root.right, val)
def delete(self, val: int):
if self.root is None:
return
self.root = self._delete_node(self.root, val)
def _delete_node(self, root: TreeNode, val: int):
if root is None:
return None
if root.val == val:
# 删除当前节点
if root.left and root.right:
# 左右子树不为空,找到右子树中最小的点更新为当前节点的值,然后递归的删除右子树中改节点的值
left_node = self._get_min_node(root.right)
root.val = left_node.val
root.right = self._delete_node(root.right, left_node.val)
elif root.left is None:
# 左子树为空
root = root.right
elif root.right is None:
# 右子树为空
root = root.left
else:
root = None
elif root.val > val:
root.left = self._delete_node(root.left, val)
else:
root.right = self._delete_node(root.right, val)
return root
def query(self, val):
self._query_node(self.root, val)
def _query_node(self, root: TreeNode, val: int) -> TreeNode:
if root is None:
return None
if root.val == val:
return root
elif root.val >= val:
return self._query_node
return -1
def get_min(self)-> TreeNode:
return self._get_min_node(self.root)
def _get_min_node(self, root: TreeNode) -> TreeNode:
if root.left is None:
return root
return self._get_min_node(root.left)
def get_max(self) -> TreeNode:
return self._get_max_node(self.root)
def _get_max_node(self, root: TreeNode) -> TreeNode:
if root.right is None:
return root
return self._get_max_node(root.right)
def get_array(self) -> List:
arr = []
self._get_array(self.root, arr)
return arr
def _get_array(self, root: TreeNode, arr: List):
if root is None:
return
self._get_array(root.left, arr)
arr.append(root.val)
self._get_array(root.right, arr)