读书人

小弟我的搜索二叉树 出了一些大有关问

发布时间: 2012-01-31 21:28:41 作者: rapoo

我的搜索二叉树 出了一些大问题(删除的时候会丢掉子树)
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的了解不是很好 我明白可能是空引用问题 但是为什么??是每个节点都是没有必然物理联系的吗??



[解决办法]
算法的问题看到头疼

帮顶吧...
[解决办法]
我没有仔细看你写的,不过这种问题呢,最好是在纸上画出来,那些旧的连接是要切断的,那些新的连接是要建立的,要注意切断和新连接的顺序。

读书人网 >J2SE开发

热点推荐