二叉查找树中节点的删除

xiaoxiao2021-02-28  95

二叉树的重要性质:

1.若左子树不空,则左子树上所有的结点的值均小于它的根结点的值

2.如右子树不空,则右子树所有的结点的值均大于它的根结点的值

3.左右子树也分别为二叉排序树

删除结点需要考虑一下三种情况:

1.需要删除的结点下并没有其他子节点

2.需要删除的结点下有一个子节点(左或右)

3.需要删除的结点下有两个子节点(左右结点都在)

private Node<T> remove(T data,Node<T> node) { if(data == null) return node; /** * compare函数内部实现大致如下: * ((comparable)data).compareTo(node.element); * 比较需要删除的数据与当前节点的值的大小 */ int result = compare(data,node.element); //result<0:表示需要删除的节点在左子树。(二叉查找数的性质) if(result<0) node.left = remove(data,node.left); else if(result>0)//在右子树 node.right = remove(data,node.right); else if(node.left != null && node.right != null)//找到需要删除的节点且节点下有两个子节点 { /**先找到需要删除的节点下,右子树中最小的节点 * 并将它的值赋给需要删除的节点。 * */ node.element = findMin(node.right).element; //删除前面找到的最小的节点。 node.right = remove(node.right); } else//找到需要删除的节点且节点下有一个子节点(左或者右) node = (node.left != null) ? node.left : node.right; } public void remove(T data) { this.remove(data,root); }

转载请注明原文地址: https://www.6miu.com/read-41631.html

最新回复(0)