CS 61B lab11
测试结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private BinaryTreeNode findHelper(Comparable key, BinaryTreeNode node) { // Replace the following line with your solution. BinaryTreeNode movingnode = node; while(movingnode!=null){ if(key.compareTo((Comparable)(movingnode.entry.key))>0){ movingnode=movingnode.rightChild; }else if(key.compareTo((Comparable)(movingnode.entry.key))<0){ movingnode=movingnode.leftChild; }else return movingnode; } return null; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public Entry remove(Object key) { // Replace the following line with your solution. if(find(key)==null) return null; BinaryTreeNode movingnode = root; int flag = 0; //为了知道找到的node是parent的左孩子还是右孩子还是root本身 //find the node while(movingnode!=null){ if(((Comparable)key).compareTo((Comparable)(movingnode.entry.key))>0){ movingnode=movingnode.rightChild; flag=1; }else if(((Comparable)key).compareTo((Comparable)(movingnode.entry.key))<0){ movingnode=movingnode.leftChild; flag=2; }else{ BinaryTreeNode returnnode=movingnode; //为了能返回 size--; if(movingnode.leftChild==null&&movingnode.rightChild==null){ if(flag==1){ movingnode.parent.rightChild=null; }else if(flag==2){ movingnode.parent.leftChild=null; }else root=null; // movingnode=null; }else if(movingnode.leftChild!=null&&movingnode.rightChild!=null){ BinaryTreeNode targetnode=movingnode; movingnode=movingnode.rightChild; flag=1; while(movingnode.leftChild!=null){ movingnode=movingnode.leftChild; flag=2; } targetnode.entry=movingnode.entry; if(flag==1){ movingnode.parent.rightChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} }else{ movingnode.parent.leftChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} } }else if(movingnode.leftChild!=null){ if(flag==1){ movingnode.parent.rightChild=movingnode.leftChild; if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;} }else if(flag==2){ movingnode.parent.leftChild=movingnode.leftChild; if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;} }else{ //root root=movingnode.leftChild; } }else{ if(flag==1){ movingnode.parent.rightChild=movingnode.rightChild; if(movingnode.rightChild!=null){ movingnode.rightChild.parent=movingnode.parent;} }else if(flag==2){ movingnode.parent.leftChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} }else{ //root root=movingnode.rightChild; } } return returnnode.entry; } } return null; }
期间发现自己一个错。。。天真的以为把node=null可以把它原本指向也变成null。。。哈哈哈写晕了
发现可以直接利用一下findhelper,写了一个另一个版本的remove,判断node为左孩子还是右孩子的方法还可以比较key。代码短了一点点哈哈
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public Entry remove(Object key) { BinaryTreeNode movingnode = findHelper((Comparable)key,root); if(findHelper((Comparable)key,root)==null){return null;} size--; BinaryTreeNode returnnode=movingnode; if(movingnode.leftChild==null&&movingnode.rightChild==null){ if(movingnode.parent==null){ root=null; }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))<0){ movingnode.parent.rightChild=null; }else movingnode.parent.leftChild=null;; // movingnode=null; }else if(movingnode.leftChild!=null&&movingnode.rightChild!=null){ BinaryTreeNode targetnode=movingnode; movingnode=movingnode.rightChild; while(movingnode.leftChild!=null){ movingnode=movingnode.leftChild; } if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))<0){ movingnode.parent.rightChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} }else{ movingnode.parent.leftChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} } targetnode.entry=movingnode.entry; }else if(movingnode.leftChild!=null){ if(movingnode.parent==null){ root=movingnode.leftChild; }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))>0){ movingnode.parent.leftChild=movingnode.leftChild; if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;} }else{ //root movingnode.parent.rightChild=movingnode.leftChild; if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;} } }else{ if(movingnode.parent==null){ root=movingnode.rightChild; }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))>0){ movingnode.parent.leftChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} }else{ //root movingnode.parent.rightChild=movingnode.rightChild; if(movingnode.rightChild!=null){ movingnode.rightChild.parent=movingnode.parent;} } } return returnnode.entry; }
太傻了。。。我到底在想些什么,刚刚看熊孩子的判断node为左孩子还是右孩子,直接判断node==node.parent.rightChild?不就行了。。我到底在想些什么。。。。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public Entry remove(Object key) { BinaryTreeNode movingnode = findHelper((Comparable)key,root); if(findHelper((Comparable)key,root)==null){return null;} size--; BinaryTreeNode returnnode=movingnode; if(movingnode.leftChild==null&&movingnode.rightChild==null){ if(movingnode.parent==null){ root=null; // }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))<0){ }else if(movingnode.parent.rightChild==movingnode){ movingnode.parent.rightChild=null; }else movingnode.parent.leftChild=null;; // movingnode=null; }else if(movingnode.leftChild!=null&&movingnode.rightChild!=null){ BinaryTreeNode targetnode=movingnode; movingnode=movingnode.rightChild; while(movingnode.leftChild!=null){ movingnode=movingnode.leftChild; } // if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))<0){ if(movingnode.parent.rightChild==movingnode){ movingnode.parent.rightChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} }else{ movingnode.parent.leftChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} } targetnode.entry=movingnode.entry; }else if(movingnode.leftChild!=null){ if(movingnode.parent==null){ root=movingnode.leftChild; // }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))>0){ }else if(movingnode.parent.leftChild==movingnode){ movingnode.parent.leftChild=movingnode.leftChild; if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;} }else{ //root movingnode.parent.rightChild=movingnode.leftChild; if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;} } }else{ if(movingnode.parent==null){ root=movingnode.rightChild; // }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))>0){ }else if(movingnode.parent.leftChild==movingnode){ movingnode.parent.leftChild=movingnode.rightChild; if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;} }else{ //root movingnode.parent.rightChild=movingnode.rightChild; if(movingnode.rightChild!=null){ movingnode.rightChild.parent=movingnode.parent;} } } return returnnode.entry; }