📅  最后修改于: 2023-12-03 15:12:39.549000             🧑  作者: Mango
给定一棵二叉搜索树,你需要实现该二叉搜索树的以下函数:
find(x)
:如果树中存在值为x的节点,则返回true,否则返回false。insert(x)
:如果树中不存在值为x的节点,则插入值为x的节点,并返回true,否则返回false。remove(x)
:如果树中存在值为x的节点,则删除该节点,并返回true,否则返回false。对于一棵二叉搜索树,其满足左子树所有节点的值小于根节点的值,右子树所有节点的值大于根节点的值。可以根据二叉搜索树的这个特性,实现3个函数。
find(x)
:从根开始,判断当前节点值是否等于x,如果等于则返回true,否则根据二叉搜索树的性质,在左子树或右子树中递归查找。
insert(x)
:从根开始,判断当前节点值是否等于x,如果等于说明已经存在该节点,直接返回false,否则根据节点值与x的大小关系,在左子树或右子树中递归查找,直到找到一个空节点,将x插入,并返回true。
remove(x)
:需要找到节点的位置,然后根据其左子树和右子树的情况,删除该节点后重新整理二叉搜索树的结构。这里分为3种情况:
class TreeNode:
def __init__(self,x):
self.val = x
self.left = None
self.right = None
class BST:
def __init__(self):
self.root = None
# 查找节点
def find(self, x):
if not self.root:
return False
return self._find(x,self.root)
# 递归查找节点
def _find(self,x,node):
if not node:
return False
if node.val == x:
return True
elif node.val > x:
return self._find(x,node.left)
else:
return self._find(x,node.right)
# 插入节点
def insert(self,x):
if not self.root:
self.root = TreeNode(x)
return True
else:
return self._insert(x,self.root)
# 递归插入节点
def _insert(self,x,node):
if node.val == x:
return False
elif node.val > x:
if not node.left:
node.left = TreeNode(x)
return True
else:
return self._insert(x,node.left)
else:
if not node.right:
node.right = TreeNode(x)
return True
else:
return self._insert(x,node.right)
# 删除节点
def remove(self, x):
if not self.root:
return False
else:
return self._remove(x, self.root)
# 递归删除节点
def _remove(self, x, node):
if not node:
return False
if node.val == x:
if not node.left and not node.right:
node = None
return True
elif not node.left:
node = node.right
return True
elif not node.right:
node = node.left
return True
else:
pre = node.left
while pre.right:
pre = pre.right
node.val = pre.val
node.left = self._remove(pre.val, node.left)
return True
elif node.val > x:
node.left = self._remove(x, node.left)
else:
node.right = self._remove(x, node.right)
return False
以上就是二叉搜索树的实现,可以对其进行单元测试来测试其正确性。