📅  最后修改于: 2023-12-03 14:58:18.086000             🧑  作者: Mango
这是一道GATE模拟题目,是一个算法题,要求编写一个程序实现二叉搜索树的插入和删除操作,并输出删除的节点的值。
给定一个二叉搜索树,请你在其中增加新的节点,并删除一个存在的节点,输出删除节点的值。如果删除的节点有两个子节点,则用右子树的最小节点替换该节点。
class Node:
def __init__(self, val=None):
self.val = val
self.left = None
self.right = None
def insert(root, val):
if root is None:
return Node(val)
else:
if root.val == val:
return root
elif val < root.val:
root.left = insert(root.left, val)
else:
root.right = insert(root.right, val)
return root
def delete(root, val):
if root is None:
return root
elif val < root.val:
root.left = delete(root.left, val)
return root
elif val > root.val:
root.right = delete(root.right, val)
return root
else:
if root.left is None and root.right is None:
root = None
return root
elif root.left is None:
temp = root
root = root.right
del temp
return root
elif root.right is None:
temp = root
root = root.left
del temp
return root
else:
curr_node = root.right
while curr_node.left:
curr_node = curr_node.left
root.val = curr_node.val
root.right = delete(root.right, curr_node.val)
return root
这里采用了Python语言实现,定义了一个Node类,表示二叉搜索树的一个节点。
insert()
方法用于插入节点,它接受一个根节点和一个待插入的值。若根节点为None,则新建一个节点作为根节点,并将值赋给它。否则,如果待插入的值等于根节点的值,则返回根节点本身。如果待插入的值小于根节点的值,则递归调用insert()
方法,将根节点的左子树作为根节点,待插入的值作为参数。如果待插入的值大于根节点的值,则递归调用insert()
方法,将根节点的右子树作为根节点,待插入的值作为参数。最后,返回根节点。
delete()
方法用于删除节点,它接受一个根节点和待删除的值。如果根节点为None,则直接返回根节点。如果待删除的值小于根节点的值,则递归调用delete()
方法,将根节点的左子树作为根节点,待删除的值作为参数。如果待删除的值大于根节点的值,则递归调用delete()
方法,将根节点的右子树作为根节点,待删除的值作为参数。如果待删除的值等于根节点的值,则开始进行删除操作。如果该节点既没有左子树也没有右子树,则将它设置为None即可。如果该节点只有左子树或右子树,则将该节点的左子树/右子树作为新的根节点。如果该节点既有左子树也有右子树,则用右子树的最小节点替换该节点,然后删除右子树的最小节点。最后,返回根节点。
这道题涉及了二叉搜索树的插入和删除操作,如果对二叉搜索树的基本概念和原理不熟悉的话,可能会比较难理解。不过,通过逐步分析代码的实现,我们可以领略到二叉搜索树的精髓之处。