二叉树的删除和修改
二叉树的删除比较复杂。你要先找到要删除的结点。要删除的结点对象并不一定要删除。因为通过函数调用得到的只是他的副本。并不会真正的把他删掉。你只要让他不在树上就ok了。让删除结点的父节点,左右孩子结点用新的结点来指向就把该结点从树上删除了。
然后找到要插入的结点。
找法有三种情况:删除结点有左孩子
这种情况下,找到左孩子的最右孩子。找到的结点是要上去的结点。如果该左孩子没有右孩子,则该左孩子是要上去的结点。
删除结点没有左孩子,有右孩子
要上去的结点是最右孩子。
删除结点没有孩子(叶节点)
这种情况直接让指向他的父结点指向空就行了,就把他从树上删除了。
注意事项:
原来删除结点的左右孩子结点和父结点不用管,只要把该插入结点的值给删除结点就行了,同时你还要把上去的结点的孩子结点处理一下。以便不影响后续操作。
虽然说得有些绕,不过其实也没什么东西。就是把插入结点的值给删除节点。然后做一下交接,不能影响后续的操作,也不要破坏二叉排序树的性质就行了。建议在纸上画一个排序树,然后试着删除一个结点,看看怎么处理上去的结点。
下面看代码:public void Delete(Tree root,int value) {
Tree temp=new Tree();
temp=Select(root, value);
if(temp.value==0) {
System.out.println("你要删除的数值"+value+"不存在");
}
else {
Tree p=new Tree();
Tree node=new Tree();
Tree parent=new Tree();
p=p.Select(root, value);//p是要删除的结点
node=p;
if(p!=null) {
if(p.left!=null) {
p=node.left;
while(p.right!=null) {
p=p.right;
}
node.value=p.value;
if(node.left.right==null) {
node.left=p.left;
}
else{
p.parent.right=p.left;
}
}
else if(p.right!=null)
{
p=p.right;
node.value=p.value;
node.left=p.left;
node.right=p.right;
}
else {
if(p.equals(p.parent.left))
{
p.parent.left=null;
}
if(p.equals(p.parent.right))
{
p.parent.right=null;
}
}System.out.println("");
System.out.println("数据"+value+"删除成功");
}
}
}System.out.println("树初始化序列为:");
init.Bst(tree[0]);
init.Delete(tree[0], 18);
init.Bst(tree[0]);
System.out.println("");
init.Delete(tree[0], 88);
init.Bst(tree[0]);
更新操作比较简单:
调用select和delete和insert函数就可以
先把他从树上删除,然后再insert到树上public void Update(Tree root,int value,int update) {
Tree temp=new Tree();
temp=temp.Select(root, value);
if(temp.value==value) {
Delete(root,value);
Tree a= new Tree(update);
insert(root,a);
System.out.println("数据"+value+"成功更新成"+update);
}
else {
System.out.println("数据"+value+"更新失败");
}
}