首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

小弟我的搜索二叉树 出了一些大有关问题(删除的时候会丢掉子树)

2012-01-31 
我的搜索二叉树 出了一些大问题(删除的时候会丢掉子树)publicvoiddeleteItem(KeyedItemtarget)throwsTreeE

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



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

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

热点排行