我的搜索二叉树 出了一些大问题(删除的时候会丢掉子树)
public void deleteItem( KeyedItem target ) throws TreeException
{
if( target == null )
{
throw new TreeException( "the deference is null " );
}
TreeItem delTemp = searchItem( target );//找寻节点
if( delTemp == null )
{
throw new TreeException( "the note do not exsit!! " );
}
else
{
if( delTemp.getLeftTree() == null && delTemp.getRightTree() == null )//要删除的目标是叶子寄点
{
TreeItem delTempPar = binaryGetParent( target );//找到母节点
DelSwitch( delTempPar, null );//删除切换
}
else if( delTemp.getLeftTree() == null && delTemp.getRightTree() != null )//要删除的目标有右一个孩子
{
TreeItem delTempPar = binaryGetParent( target );//找到母节点
DelSwitch( delTempPar, delTemp.getRightTree() );//give the RightSubTree to the mother node
}
else if( delTemp.getLeftTree() != null && delTemp.getRightTree() == null )//要删除的目标有左一个孩子
{
TreeItem delTempPar = binaryGetParent( target );//找到母节点
DelSwitch( delTempPar, delTemp.getLeftTree() );//give the LeftSubTree to the mother node
}
else
{
//找到替换内容的节点 就是要被删除的节点的右子树的最深度的左节点的内容
TreeItem plmP = processLeftMost( delTemp.getRightTree() );
//plmP.getSearchKey().display();
TreeItem delTempPar = binaryGetParent( plmP.getData() );//找到拥有替换数据的母节点
delTemp.setData( plmP.getData() );//将要删除的节点的数据用有用数据替换掉
if( plmP.getRightTree() == null )//是叶子节点
{
delTempPar.setRightTree( null );//将这个最深左节点(叶子节点)删除
}
else
{
delTempPar.setRightTree( plmP.getRightTree() );
System.out.println( "********************** " );
preOrder( delTempPar );//这句只是测试
}
}
}
}
主方法如下
public class TreeTest
{
public static void main( String[] args )
{
BinarySearchTree a = new BinarySearchTree();
a.searchTreeInsert( "a ", "123 ", "456 " );
a.searchTreeInsert( "b ", "234 ", "666 " );
a.searchTreeInsert( "d ", "123 ", "456 " );
a.searchTreeInsert( "z ", "123 ", "456 " );
a.searchTreeInsert( "s ", "123 ", "456 " );
a.searchTreeInsert( "x ", "222 ", "574 " );
a.searchTreeInsert( "i ", "344 ", "443 " );
a.searchTreeInsert( "c ", "343 ", "546 " );
a.searchTreeInsert( "k ", "797 ", "087 " );
a.searchTreeInsert( "j ", "786 ", "675 " );
a.preOrderTraverse();
//a.postOrderTraverse();
//a.inOrderTraverse();
KeyedItem key = new KeyedItem( "b ");
//a.binaryGetParent( key );
a.test( key );
a.preOrderTraverse();
}
}
运行结果
Name: m
Mobile Phone Num: 000
Home Num: 000
Name: a
Mobile Phone Num: 123
Home Num: 456
Name: b
Mobile Phone Num: 234
Home Num: 666
Name: d
Mobile Phone Num: 123
Home Num: 456
Name: c
Mobile Phone Num: 343
Home Num: 546
Name: i
Mobile Phone Num: 344
Home Num: 443
Name: k
Mobile Phone Num: 797
Home Num: 087
Name: j
Mobile Phone Num: 786
Home Num: 675
Name: z
Mobile Phone Num: 123
Home Num: 456
Name: s
Mobile Phone Num: 123
Home Num: 456
Name: x
Mobile Phone Num: 222
Home Num: 574
**********************
Name: m
Mobile Phone Num: 000
Home Num: 000
Name: a
Mobile Phone Num: 123
Home Num: 456
Name: d
Mobile Phone Num: 123
Home Num: 456
Name: z
Mobile Phone Num: 123
Home Num: 456
Name: s
Mobile Phone Num: 123
Home Num: 456
Name: x
Mobile Phone Num: 222
Home Num: 574
Press any key to continue...
b被删掉以后 我让b的母节点接受他的字树 但是除了被接受的那个节点以外 这个被接受节点的全部子树都丢失了
我学C++的 对JAVA的了解不是很好 我明白可能是空引用问题 但是为什么??是每个节点都是没有必然物理联系的吗??
[解决办法]
算法的问题看到头疼
帮顶吧...
[解决办法]
我没有仔细看你写的,不过这种问题呢,最好是在纸上画出来,那些旧的连接是要切断的,那些新的连接是要建立的,要注意切断和新连接的顺序。