做投资的网站,杭州手机建设网站,网站上做推广方案,网页设计站点二叉排序树的插入和删除操作都是在保持二叉排序树特性的前提下进行的。
插入操作#xff1a;
在二叉排序树中插入一个新节点时#xff0c;先比较新节点的值和当前节点的值的大小关系#xff0c;若小于当前节点#xff0c;则继续在当前节点的左子树中查找#xff1b;若大…二叉排序树的插入和删除操作都是在保持二叉排序树特性的前提下进行的。
插入操作
在二叉排序树中插入一个新节点时先比较新节点的值和当前节点的值的大小关系若小于当前节点则继续在当前节点的左子树中查找若大于当前节点则继续在当前节点的右子树中查找。重复该过程直到找到一个空节点将新节点插入到该位置上。
删除操作
删除操作比较复杂需要分类讨论。 若待删除节点为叶子节点直接删除即可。 若待删除节点只有一个子节点将其子节点替代自身即可。 若待删除节点有两个子节点则需要寻找其右子树中的最小值节点或左子树中的最大值节点来替代自身然后再将该最小值节点或最大值节点删除。 具体过程如下
在二叉排序树中查找待删除节点并记录其父节点对待删除节点进行分类讨论若为叶子节点或只有一个子节点则直接删除若待删除节点有两个子节点则找到其右子树中的最小值节点或左子树中的最大值节点将该最小值节点或最大值节点替代待删除节点并将其子节点链接到其父节点上 若待删除节点为根节点则替换根节点。需要注意的是在删除节点之后为了保持二叉排序树的特性需要对该节点的父节点及其祖先节点进行平衡调整。
class Node:def __init__(self, key):self.left Noneself.right Noneself.key keydef insert(root, key):if root is None:return Node(key)if key root.key:root.left insert(root.left, key)elif key root.key:root.right insert(root.right, key)return rootdef minValueNode(node):current nodewhile(current.left is not None):current current.leftreturn currentdef deleteNode(root, key):if root is None:return rootif key root.key:root.left deleteNode(root.left, key)elif(key root.key):root.right deleteNode(root.right, key)else:if root.left is None:temp root.rightroot Nonereturn tempelif root.right is None:temp root.leftroot Nonereturn temptemp minValueNode(root.right)root.key temp.keyroot.right deleteNode(root.right, temp.key)return root