二树 ,增 、删、查

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 ;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值