今天所讲的是二叉树的删除,小伙伴们点进来,肯定是对二叉树有说了解的吧啊,首先学习二叉树删除,建议先了解诶二叉树的建立,遍历,插入和查找,以便小伙伴们能够很好的掌握今天小编所讲的内容,接下来让我们一起来了解下吧。
二叉树的删除操作是比较复杂的。首先要找到删除的节点。要删除的结点对象并不一定要进行删除操作。因为通过函数调用得到的只是他的副本。并不会真正的把他删掉。你只要让他不在树上就行了。让删除结点的父节点,左右孩子结点用新的结点来指向就可以把该结点从树上进行删除了。
然后找到要插入的结点。有三种情况来进行找:
1.删除结点有左孩子
这种情况下,找到左孩子的最右孩子。找到的结点是要上去的结点。如果该左孩子没有右孩子,则该左孩子是要上去的结点。
2.删除结点没有左孩子,有右孩子
要上去的结点是最右孩子。
3.删除结点没有孩子(叶节点)
这种情况直接让指向他的父结点指向空就行了,就把他从树上删除了。
注意事项:
原来删除结点的左右孩子结点和父结点不用管,只要把该插入结点的值给删除结点就行了,同时你还要把上去的结点的孩子结点处理一下。这样可以不影响后续的操作。
总而言之就是把插入结点的值给删除节点。然后做一下交接,不能影响后续的操作,也不要破坏二叉排序树的性质就行了。推荐在纸上画一个排序树,然后试着删除一个结点,看看怎么处理上去的结点。
理论是不是已经掌握好了?接下来给大家通过代码的方式给大家展示。
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 + "删除成功"); } } }
以上就是今天所讲的二叉树删除的java常见问答,如果想要了解更多,请继续关注本网站。