JAVA数据结构与算法(五)搜索二叉树(bst)的CURD操作

JAVA数据结构与算法(五)搜索二叉树(bst)的CURD操作

它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,
则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
在这里插入图片描述
查找时,从根节点与要查的数对比,大则在右子树查找,小则在左子树查找
添加时类似上面查找
删除是考虑三种情况,1.如果是叶节点直接删除,父节点针变为空,2.如果只有一个孩子节点,将父节点指针指向要删除节点的孩子节点 3.如果要删的左右都有,则将左子树种的最大元素替代或者右子树的最小元素替代
具体代码如下:

public class SearchBinaryTree {
	 private TreeNode root;
	 public SearchBinaryTree(){
		 
	 }
	//放入
	   public TreeNode put(int data){
		   TreeNode node=null;
		   TreeNode parent=null;
		   if(root==null){           
			   node=new TreeNode(data);
			   root=node;
			  return node;
		   }
		   node=root;
		   while(node!=null){
			   parent=node;
			   if(data<node.data){
				   node=node.leftChild;
			   }else if(data>node.data){
				   node=node.rightChild; 
			   }else{
				   return node;
			   }
		   }
		   //添加到相应位置
		   node=new TreeNode(data);
		   if(data<parent.data){
			   parent.leftChild=node;
		   }else{
			   parent.rightChild=node;
		   }
		   node.parent=parent;
		return node;
	   }
	   //删除
	   public TreeNode delete(TreeNode node){
		   if(node.leftChild==null&&node.rightChild==null){ //节点无左也无右孩子节点
			   TreeNode parent=node.parent;
			   if(node==parent.leftChild){
				   parent.leftChild=null;
			   }else{
				   parent.rightChild=null;
			   }
			   return root;
		   }
		if(node.leftChild==null&&node.rightChild!=null){  //节点左孩子节点为空,右孩子节点不为空
			TreeNode parent=node.parent;
			if(node==parent.leftChild){
				parent.leftChild=node.rightChild;
				node.rightChild.parent=parent;
			}else{
				parent.rightChild=node.rightChild;
				node.rightChild.parent=parent;
			}
			return root;
		}
		if(node.leftChild!=null&&node.rightChild==null){  //节点的左孩子不为空,右孩子为空
			TreeNode parent=node.parent;
			if(node==parent.leftChild){
				parent.leftChild=node.leftChild;
				node.leftChild.parent=parent;
			}else{
				parent.rightChild=node.leftChild;
				node.leftChild.parent=parent;
			}
			return root;
		}
		if(node.leftChild!=null&&node.rightChild!=null){  //节点的左右孩子节点都非空,则删除后继节点,并用后继节点取代该节点
			TreeNode successnode=successor(node);
			delete(successnode);
			node.data=successnode.data;
		}
		return root;
	   }
	   //求后继节点
	   public TreeNode successor(TreeNode node){
		   if(node.rightChild!=null){
			   TreeNode minnode=node.rightChild;
			   while(minnode.leftChild!=null){
				   minnode=minnode.leftChild;
			   }
			   return minnode;
		   }else{
			   TreeNode parentnode=node.parent;
			   while(parentnode!=null&&node==parentnode.rightChild){
				   node=parentnode;
				   parentnode=parentnode.parent;
			   }
			   return parentnode;
		   }
	   }
	   //查找
	   public TreeNode search(int data){
		   TreeNode node=root;
		   while(node!=null&&node.data!=data){
			   if(data<node.data){
				   node=node.leftChild;
			   }else{
				   node=node.rightChild;
			   }
		   }
		return node;
	   }
	   
	   //改变
	   public void update(int olddata,int newdata){
		   delete(search(olddata));
		   put(newdata);
	   }
		//中序
		public  void  inOrder(TreeNode head){
			if(head==null){
				return;
			}
			inOrder(head.leftChild);
			System.out.println(head.getData()+" ");
			inOrder(head.rightChild);
		}
	public static void main(String[] args) {
		SearchBinaryTree binarytree=new SearchBinaryTree();
		int [] arr={50,30,20,40,10,70,80,90};          
	   for(int i:arr){
		   binarytree.put(i);
	   }
	   binarytree.inOrder(binarytree.root);
	   binarytree.delete(binarytree.search(70));  //删除70
	   binarytree.inOrder(binarytree.root);
	   binarytree.update(50, 60);                          
	   binarytree.inOrder(binarytree.root);
	}
   
class TreeNode{
	   private int data;
	   private TreeNode leftChild;
	   private TreeNode rightChild;
	   private TreeNode parent;
	   private TreeNode root;
	public TreeNode(int data) {
		super();
		this.data = data;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值