好好学数据结构 - 手撕二叉树增删改查

 呵。。写到删除的时候 说实话蒙的一比。充分暴露除了数据结构的不足。下面献上自己写的结构。粗略测过,供大家参考吧,如果有漏洞不足还请指出。。恩。

package binaryTree;

import java.util.ArrayList;
import java.util.List;

public class BinaryTree<E extends Comparable<E>>{
    
	//成员变量
    private BinaryTreeNode<E> nodeData;
    private int size;
    
    //构造器
    public BinaryTree () {
        this.nodeData = null;
        this.size = 0;
    }
    public BinaryTree(E e) {
        this.nodeData = new BinaryTreeNode<E>(e);
    }
 
    //(空树)增加一个节点
    public boolean add(E e) {
        if(null ==nodeData) {
            nodeData = new BinaryTreeNode<E>(e);
            size++;
            return true;
        }
        if(add(nodeData,e)) {
        	size++;
        	return true;
        }
        return false;
    }
    
    //(非空树)增加一个节点
    private boolean add(BinaryTreeNode<E> nodeData,E e) {
        if(e.compareTo(nodeData.e)<0 ){
            if(null == nodeData.left) {
                nodeData.left = new BinaryTreeNode<E>(e);
                return true;
            }else {
                add(nodeData.left,e);
            }
        }else if(e.compareTo(nodeData.e)>0 ) {
            if(null == nodeData.right) {
                nodeData.right = new BinaryTreeNode<E>(e);
                return true;
            }else {
                add(nodeData.right,e);
            }
        }
        return true;
    }
    
    //先序遍历 【根左右】
    public List<E> preOrderScan(BinaryTreeNode<E> nodeData){
    	List<E> eList = new ArrayList<E>(size); 
    	preOrderScan(nodeData==null?this.nodeData:nodeData,eList);
    	return eList;
    }
    private void preOrderScan(BinaryTreeNode<E> nodeData,List<E> eList) {
    	if(null != nodeData) {
    		eList.add(nodeData.e);
    		preOrderScan(nodeData.left,eList);
    		preOrderScan(nodeData.right,eList);
    	}
    }
    
    //中序遍历 【左根右】
    public List<E> inOrderScan(BinaryTreeNode<E> nodeData){
    	List<E> eList = new ArrayList<E>(size); 
    	inOrderScan(nodeData==null?this.nodeData:nodeData,eList);
    	return eList;
    }
    private void inOrderScan(BinaryTreeNode<E> nodeData,List<E> eList) {
    	if(null != nodeData) {
    		preOrderScan(nodeData.left,eList);
    		eList.add(nodeData.e);
    		preOrderScan(nodeData.right,eList);
    	}
    }
    
    //后续遍历 【左右根】
    public List<E> postOrderScan(BinaryTreeNode<E> nodeData){
    	List<E> eList = new ArrayList<E>(size); 
    	postOrderScan(nodeData==null?this.nodeData:nodeData,eList);
    	return eList;
    }
    private void postOrderScan(BinaryTreeNode<E> nodeData,List<E> eList) {
    	if(null != nodeData) {
    		postOrderScan(nodeData.left,eList);
    		postOrderScan(nodeData.right,eList);
    		eList.add(nodeData.e);
    	}
    }
    
    //获取最大的节点
    public BinaryTreeNode<E> getMaxDataNode(BinaryTreeNode<E> nodeData) {
    	BinaryTreeNode<E> maxDataNode = nodeData==null?this.nodeData:nodeData;
    	while(null!=maxDataNode.right) {
    		maxDataNode = maxDataNode.right;
    	}
    	return maxDataNode;
    }
    
    //获取最小的节点
    public BinaryTreeNode<E> getMinDataNode(BinaryTreeNode<E> nodeData) {
    	BinaryTreeNode<E> minDataNode = nodeData==null?this.nodeData:nodeData;
    	while(null!=minDataNode.left) {
    		minDataNode = minDataNode.left;
    	}
    	return minDataNode;
    }
    
  //获取节点
    public BinaryTreeNode<E> getNodeData(E e) {
    	BinaryTreeNode<E> nodeData = this.nodeData;
    	if(e == nodeData.e) {
    		return nodeData;
    	}
    	while(nodeData!=null) {
    		if(e.compareTo(nodeData.e)>0) {
    			nodeData = nodeData.right;
    			continue;
    		}else if(e.compareTo(nodeData.e)<0) {
    			nodeData = nodeData.left;
    			continue;
    		}else if(e.compareTo(nodeData.e)==0) {
    			return nodeData;
    		}
    	}
    	return null;
    }
    
    //获取父节点
    public BinaryTreeNode<E> getSuperNodeData(BinaryTreeNode<E> nodeData) {
    	BinaryTreeNode<E> parentDataNode = this.nodeData;
    	if(null == nodeData || nodeData == parentDataNode) {
    		return null;
    	}
    	BinaryTreeNode<E> tempDataNode = this.nodeData;
    	while(tempDataNode!=null) {
    		if(nodeData.e.compareTo(tempDataNode.e)>0) {
    			parentDataNode = tempDataNode;
    			tempDataNode = tempDataNode.right;
    			continue;
    		}else if(nodeData.e.compareTo(tempDataNode.e)<0) {
    			parentDataNode = tempDataNode;
    			tempDataNode = tempDataNode.left;
    			continue;
    		}else if(nodeData.e.compareTo(tempDataNode.e)==0) {
    			return parentDataNode;
    		}
    	}
    	return null;
    }
    
    //获取父节点
    public BinaryTreeNode<E> getSuperNodeData(E e) {
    	BinaryTreeNode<E> parentDataNode = this.nodeData;
    	if(null == e || e == parentDataNode.e) {
    		return null;
    	}
    	BinaryTreeNode<E> tempDataNode = this.nodeData;
    	while(tempDataNode!=null) {
    		if(e.compareTo(tempDataNode.e)>0) {
    			parentDataNode = tempDataNode;
    			tempDataNode = tempDataNode.right;
    			continue;
    		}else if(e.compareTo(tempDataNode.e)<0) {
    			parentDataNode = tempDataNode;
    			tempDataNode = tempDataNode.left;
    			continue;
    		}else if(e.compareTo(tempDataNode.e)==0) {
    			return parentDataNode;
    		}
    	}
    	return null;
    }
    
    //获取二叉树节点个数
    public int getSize() {
        return size;
    }
    //判断二叉树是否为空
    public boolean isEmpty() {
        return size == 0;
    }
 
    /**
     * 删除节点
     * 四种情况
     * 1、待删除节点的左右子都是null
     * 2、待删除节点的左子为null
     * 3、待删除节点的右子为null
     * 4、待删除节点的左右子都不是null
     * @param e
     * @return
     */
    
	public boolean remove(E e) {
		BinaryTreeNode<E> parentNode = getSuperNodeData(e);
		BinaryTreeNode<E> deleteNode = getNodeData(e);
        if(this.remove(parentNode,deleteNode) !=null) {
        	size--;	
        	return true;
        }
        return false;
    }
    
    private BinaryTreeNode<E> remove(BinaryTreeNode<E> parentNode, BinaryTreeNode<E> deleteNode) {
        //1、待删除节点的左右子都是null,此时直接父节点的左或右子节点为空。
    	if(parentNode != null && deleteNode.left == null && deleteNode.right == null) {
            if(null != parentNode.left && parentNode.left.e == deleteNode.e) {
                parentNode.left = null;
            }else {
                parentNode.right = null;
            }
            return deleteNode;
        }else if(parentNode != null && deleteNode.left == null && deleteNode.right != null) {
            if(null != parentNode.left && parentNode.left.e == deleteNode.e) {
                parentNode.left = deleteNode.right;
            }else {
                parentNode.right = deleteNode.right;
            }
            return deleteNode;
        }else if(parentNode != null && deleteNode.left != null && deleteNode.right == null) {
            if(null != parentNode.left && parentNode.left.e == deleteNode.e) {
                parentNode.left = deleteNode.left;
            }else {
                parentNode.right = deleteNode.left;
            }
            return deleteNode;
        }else if(parentNode != null && deleteNode.left != null && deleteNode.right != null) {
        	BinaryTreeNode<E> deletedNode = deleteNode;
            if(null != parentNode.left && parentNode.left.e == deleteNode.e) {
                //取待删除节点左子树最大值,替换待删除节点
            	//parentNode.left = getMaxDataNode(deleteNode.left);
            	BinaryTreeNode<E> maxNode = getMaxDataNode(deleteNode.left);
            	deleteNode.e = remove(getSuperNodeData(maxNode),maxNode).e;
            }else {
                //取待删除节点左子树最大值,替换待删除节点
            	BinaryTreeNode<E> minNode = getMinDataNode(deleteNode.left);
            	deleteNode.e = remove(getSuperNodeData(minNode),minNode).e;
            }
            return deletedNode;
        //如果是根节点
        }else if(parentNode == null){
        	BinaryTreeNode<E> deletedNode = deleteNode;
        	BinaryTreeNode<E> maxNode = getMaxDataNode(deleteNode.left);
        	deleteNode.e = remove(getSuperNodeData(maxNode),maxNode).e;
        	return deletedNode;
        }
		return null;
    }
   
    //清空
    public void clear() {
        this.nodeData = new BinaryTreeNode();
    }
 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值