【发布时间】:2015-04-25 23:36:24
【问题描述】:
我是二叉搜索树的新手,删除节点会给我带来麻烦。我试图找出问题来看看我做错了什么,但似乎仍然看不到问题,我不想从另一个网站复制代码。
我了解如何删除有一个子节点或没有子节点的节点,并且我认为我的代码对于这些方法是正确的。我的问题是删除一个有两个孩子的节点。我无法让它正常工作。任何帮助或建议表示赞赏。
public void DeleteNode(int number) {
if (Root == null)
{
JOptionPane.showMessageDialog(null," Tree Empty, can not delete ", JOptionPane.WARNING_MESSAGE);
return;
}
Node child = Root;
Node parent = Root;
while (number != child.data) {
if (number < child.data)
{
parent = child;
child = child.left;
}
else if (number > child.data)
{
parent = child;
child = child.right;
}
if(child == null){
JOptionPane.showMessageDialog(null," Number not found",JOptionPane.WARNING_MESSAGE);
return;
}
}
if(child.right == null && child.left == null)
{
hasNoChildren(child, parent);
}
else if(child.left != null && child.right != null)
{
hasTwoChildren(child, parent);
}
else if (child.right != null && child.left == null)
{
hasRightChild(child, parent);
}
else if (child.left != null && child.right == null)
{
hasLeftChild(child, parent);
}
}
这是我删除一个有两个孩子的节点的方法
public void hasTwoChildren(Node child, Node parent)
{
Node temp = null;
if(child.data < parent.data){
Node childorg = child;
temp = child;
child = child.left;
while(child.right != null){
temp = child;
child = child.right;
}
childorg.data = child.data;
if (child.left != null && child.right == null)
{
hasLeftChild(child, temp);
}else{
temp.right = null;
}
}
else
{
Node childorg = child;
temp = child;
child = child.right;
while(child.left != null){
temp = child;
child = child.left;
}
childorg.data = child.data;
if (child.left != null && child.right == null)
{
hasRightChild(child, temp);
}else{
temp.left = null;
}
}
}
这些是我删除没有子节点或只有一个子节点的方法
public void hasNoChildren(Node child, Node parent)
{
if(child.data == Root.data)
{
Root = null;
}
else if(child.data < parent.data){
parent.left = null;
}else{
parent.right = null;
}
}
public void hasLeftChild(Node child, Node parent){
if(child.data < parent.data){
parent.left = child.left;
}else{
parent.right = child.left;
}
}
public void hasRightChild(Node child, Node parent){
if(child.data < parent.data){
parent.left = child.right;
}else{
parent.right = child.right;
}
}
【问题讨论】:
-
这个问题中
[node.js]是如何使用的? -
假设是我的错误的节点。你能帮忙吗?
标签: java binary-tree binary-search-tree nodes