package com.zf.tree;
public class TreeList<E extends Comparable<E>>{
private Node<E> root ; //根节点
//添加
public void insertItem(E data){
Node<E> newNode = new Node<E>(data);
if(isNull()){
root = newNode;
}else{
Node<E> current = root ;
while(true){
if(data.compareTo(current.data) > 0){
if(current.right == null){
current.right = newNode;
return;
}else{
current = current.right ;
continue;
}
}else{
if(current.left == null){
current.left = newNode;
return;
}else{
current = current.left ;
continue;
}
}
}
}
}
//查找
public E find(E e){
Node<E> current = root ;
while(current != null){
if(current.data.compareTo(e) == 0){
return current.data;
}else{
if(current.data.compareTo(e) > 0){
current = current.left;
}else{
current = current.right;
}
}
}
return null;
}
/**
* 移除节点
* 1、找到要移除的节点 delNode
* 2、考虑四种情况,1:delNode节点的左节点和右节点都为空 2:delNode节点左节点为空 3:delNode节点右节点为空 4:delNode节点右节点都不为空
* 如果第二部中属于第4中情况,找到delNode的后继节点 (仅大于delNode的节点) 查找方法:从delNode的rightNode开始,然后顺这leftNode查找,直到leftNode为空
* 考虑两种情况,1:后继节点右节点为空 2:后继节点右节点不为空
* @param e
* @return
*/
public E remove(E e){
Node<E> current = root ;
Node<E> prev = root ;
boolean currentLeft = false ;
while(current != null){
if(current.data.compareTo(e) == 0){ //删除
if(current.left == null && current.right == null){ //叶节点
if(current == root){ //删除root节点
root = null;
}else{
if(currentLeft)
prev.left = null;
else
prev.right = null ;
}
}else if(current.left == null && current.right != null){ //左节点为空,右节点不为空
if(current == root){
root = current.right;
}else{
if(currentLeft)
prev.left = current.right;
else
prev.right = current.right;
}
}else if(current.left != null && current.right == null){ //右节点为空,左节点不为空
if(current == root){
root = current.left;
}else{
if(currentLeft)
prev.left = current.left;
else
prev.right = current.left;
}
}else{ //左右节点都不为空
Node<E> nextMax = current.right ; //查找后继
Node<E> nextMaxPrev = current ;
while(nextMax.left != null){
nextMaxPrev = nextMax;
nextMax = nextMax.left;
}
if(nextMax == current.right){ //如果后继就为目标节点的右节点
nextMax.left = current.left;
if(currentLeft){
prev.left = nextMax;
}else{
prev.right = nextMax;
}
}else{ //后继节点为目标节点右节点的左子节点
if(nextMax.right == null){ //如果后继节点的右节点为空
nextMax.left = current.left;
nextMax.right = current.right;
nextMaxPrev.left = null ;
if(currentLeft)
prev.left = nextMax;
else
prev.right = nextMax;
}else{ //后继节点右节点不为空
nextMaxPrev.left = nextMax.right ;
nextMax.left = current.left ;
nextMax.right = current.right;
if(currentLeft)
prev.left = nextMax;
else
prev.right = nextMax;
}
}
}
return current.data;
}else{
prev = current;
if(current.data.compareTo(e) > 0){
current = current.left;
currentLeft = true;
}else{
current = current.right;
currentLeft = false;
}
}
}
return null;
}
//遍历
private void printAll(Node<E> node){
if(node != null){
printAll(node.left);
System.out.print(node.data + " ");
printAll(node.right);
}
}
public void printAll(){
System.out.println();
printAll(root);
System.out.println();
}
public boolean isNull(){
return root == null ;
}
}
package com.zf.tree;
public class Node<E extends Comparable<E>> {
public E data ;
public Node<E> left ;
public Node<E> right ;
public Node(E data){
this.data = data ;
}
}
二树 ,增 、删、查
最新推荐文章于 2024-10-30 23:09:05 发布