`

Java实现-二叉查找树(BST)的操作

 
阅读更多
see also:http://blog.csdn.net/jiqiren007/article/details/6534810
import java.util.LinkedList;

import ljn.help.*;
public class OperationsOnBinarySearchTree {

	/**
	 * It shows the operations on Binary Search Tree.
	 * see also: http://blog.csdn.net/jiqiren007/article/details/6534810
	 */
	private Node root;
	public static void main(String[] args) {
		int[] data={12,5,18,2,9,15,19,0,0,8,0,0,17,};
	  /*    12                                                     
           /   \                                                    
          5     18                                                   
        /   \   / \
       2     9 15  19
            /    \
           8      17
       */
		OperationsOnBinarySearchTree bst=new OperationsOnBinarySearchTree(data);
		bst.levelTraverse();
		bst.insert(13);
		bst.levelTraverse();
		bst.delete(13);
		bst.levelTraverse();
		bst.delete(12);
		bst.levelTraverse();
		bst.inOrder(bst.root);
		
	}
	public OperationsOnBinarySearchTree(int[] data){
		root=Helper.createTree(data);
	}
	
	public void delete(int dataDelete){
		if(root==null){
			return;
		}
		Node curNode=root;
		NodePair pair=findNodeAndParent(curNode,dataDelete);
		Node nodeDelete=pair.son;
		Node parent=pair.parent;
		if(nodeDelete==null){
			return;
		}
		if(isLeaf(nodeDelete)){
			if(parent.getLeft()==nodeDelete){
				parent.setLeft(null);
			}
			if(parent.getRight()==nodeDelete){
				parent.setRight(null);
			}
		}else{
			if( hasLeftOnly(nodeDelete)	){
				if(parent.getLeft()==nodeDelete){
					parent.setLeft(nodeDelete.getLeft());
				}
				if(parent.getRight()==nodeDelete){
					parent.setRight(nodeDelete.getLeft());
				}
			}else if( hasRightOnly(nodeDelete)	){
				if(parent.getLeft()==nodeDelete){
					parent.setLeft(nodeDelete.getRight());
				}
				if(parent.getRight()==nodeDelete){
					parent.setRight(nodeDelete.getRight());
				}
			}else{//has both left child and right child.Successor is in the min(curNode.getRight())
				NodePair tmpPair=min(nodeDelete.getRight());
				Node successor=tmpPair.son;
				Node sParent=tmpPair.parent;
				nodeDelete.setData(successor.getData());
				if(null==sParent){
					nodeDelete.setRight(null);
				}else{
					sParent.setLeft(successor.getRight());
				}
			}
		}
		
		
	}
	
	public NodePair findNodeAndParent(Node curNode,int data){
		if(curNode==null){
			return null;
		}
		Node parent=null;
		Node son=null;
		NodePair pair=null;
		while(curNode!=null){
			int curData=curNode.getData();
			if(curData==data){
				son=curNode;//when curNode.getData()==data,'parent' is null.Is it OK?
				break;
			}
			if(data<curData){
				parent=curNode;
				curNode=curNode.getLeft();
			}
			if(data>curData){
				parent=curNode;
				curNode=curNode.getRight();
			}
		}
		pair=new NodePair(son,parent);
		return pair;
	}
	public boolean hasLeftOnly(Node node){
		return node!=null&&node.getLeft()!=null&&node.getRight()==null;
	}
	public boolean hasRightOnly(Node node){
		return node!=null&&node.getRight()!=null&&node.getLeft()==null;
	}
	public boolean isLeaf(Node node){
		return node!=null&&node.getLeft()==null&&node.getRight()==null;
	}
	public NodePair min(Node curNode){
		if(curNode==null){
			return null;
		}
		Node parent=null;
		while(curNode.getLeft()!=null){//when 'curNode' has no left child,'curNode' is min,and its parent is null(ok?)
			parent=curNode;
			curNode=curNode.getLeft();
		}
		return new NodePair(curNode,parent);
	}
	
	//we don't get 'max''s parent node like 'min'
	public Node max(Node curNode){
		if(curNode==null){
			return null;
		}
		while(curNode.getRight()!=null){
			curNode=curNode.getRight();
		}
		return curNode;
	}
	
	
	public Node find(int target){
		if(root==null){//empty tree
			return null;
		}else{
			return findHelp(root,target);
		}
	}
	public Node findHelp(Node curNode,int target){
		Node result=null;
		int curData=curNode.getData();
		if(target==curData){
			result=curNode;
		}
		if(target<curData){
			findHelp(curNode.getLeft(),target);
		}
		if(target>curData){
			findHelp(curNode.getRight(),target);
		}
		return result;
	}
	
	public void insert(int dataInsert){
		if(root==null){//the tree is empty
			root=new Node(dataInsert);
		}else{
			insertHelp(root,dataInsert);
		}
	}
	
	public void insertHelp(Node curNode,int dataInsert){
		Node nodeToInsert=new Node(dataInsert);
		int curData=curNode.getData();
		if(dataInsert<=curData){//insert into left tree
			Node left=curNode.getLeft();
			if(left==null){
				curNode.setLeft(nodeToInsert);
			}else{
				insertHelp(left,dataInsert);
			}
		}
		if(dataInsert>curData){//insert into right tree
			Node right=curNode.getRight();
			if(right==null){
				curNode.setRight(nodeToInsert);
			}else{
				insertHelp(right,dataInsert);
			}
		}
	}
		
	public void levelTraverse(){
		if(root==null){
			return;
		}
		Node node=root;
		LinkedList<Node> queue=new LinkedList<Node>();
		queue.addLast(node);
		while(!queue.isEmpty()){
			node=queue.removeFirst();
			System.out.print(node.getData()+" ");
			if(node.getLeft()!=null){
				queue.addLast(node.getLeft());
			}
			if(node.getRight()!=null){
				queue.addLast(node.getRight());
			}
		}
		System.out.println();
	}
	
	public void inOrder(Node curNode){
		if(curNode==null){
			return;
		}
		inOrder(curNode.getLeft());
		System.out.print(curNode.getData()+" ");
		inOrder(curNode.getRight());
	}
	//when deleting a node,we need the node and its parent.
	private static class NodePair{
		
		Node son;
		Node parent;
		
		NodePair(Node son,Node parent){
			this.son=son;
			this.parent=parent;
		}
		
	}
	
}

1
0
分享到:
评论

相关推荐

    Java实现二叉排序树

    二叉排序树(Binary Sort Tree...在Java中实现二叉排序树时,我们需要考虑其基本操作的逻辑,并注意处理好边界条件和异常情况,以确保代码的正确性和健壮性。同时,为了优化性能,可以考虑使用自平衡的二叉排序树变体。

    java--实现二叉排序树

    在Java中实现二叉排序树通常包括以下几个基本操作: 1. **插入操作 (insert)**: 新插入的节点应满足二叉排序树的性质。如果键已经存在,可以选择更新该节点的值或者不进行操作。插入操作通常通过递归实现,首先比较...

    二叉查找树java

    以上就是关于二叉查找树在Java中的基本实现,包括插入、删除、遍历和查询等操作。通过这些操作,我们可以高效地管理一组有序数据,并进行各种数据操作。二叉查找树在实际应用中广泛用于数据库索引、文件系统以及各种...

    课程设计——二叉查找树

    如果是源代码,它可能用C++、Java或Python等编程语言编写,展示了二叉查找树的插入、删除和查找等基本操作的算法实现。如果是数据文件,它可能存储了预构建的二叉查找树,用户可以直接在程序中查看和操作这个树。 ...

    二叉查找树实现源码(C、C++、JAVA)

    在C、C++和Java这三种编程语言中实现二叉查找树,主要涉及以下几个关键操作: **插入操作:** - 首先,从根节点开始,比较新节点的键值与当前节点的键值。 - 如果新节点的键值小于当前节点,移动到当前节点的左子树...

    java实现二叉排序树

    二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。在二叉排序树中,每个节点都包含一个键值,对于任意节点,其左子树中的所有节点的键值小于该节点的键值,而...

    数据结构二叉排序树及其操作实验报告

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点的左子树只包含比其小的元素,右子树包含比其大的元素,且整个树保持自平衡。在本实验报告中,我们将深入...

    二叉排序树查找算法

    二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特点是:对于任意节点,其左子树中的所有...

    java课程设计二叉排序树

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。在Java中,我们可以利用面向对象编程的概念来实现二叉排序树...

    二叉排序树增删改查

    在iOS编程中,实现二叉排序树的增删改查操作是数据结构和算法的重要应用。CodeBlocks是一款跨平台的C++集成开发环境,虽然通常用于Windows,但它同样支持创建和调试Objective-C代码,这是iOS开发的主要语言。 ### ...

    Java实现的二叉搜索树和平衡二叉树的代码示例

    在计算机科学中,二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:每个节点包含一个键、一个关联的值、一个指向左子节点的引用以及一个指向右子节点的引用。在二叉搜索树中,...

    数据结构二叉平衡树课程设计

    - **红黑树**:一种自平衡二叉查找树,由Rudolf Bayer于1972年提出。每个节点都有颜色属性,可以是红色或黑色,通过一定的规则保证了任何路径到叶子节点的长度最多为两倍的黑色节点。 - **Splay树**:自适应的平衡...

    java 实现二叉排序树 堆

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在处理搜索、插入和删除操作时具有较高的效率,尤其对于有序数据。在二叉排序树中,每个节点的左子树只包含...

    java二叉查找树的实现代码

    部分内容中提供了java二叉查找树的实现代码,包括Node类、BST类、get方法、put方法、min方法和max方法等。下面是对这些方法的详细解释: * Node类:Node类是一个私有类,用于存储树中的节点。每个节点都有一个键、...

    java 二叉排序树与平衡二叉树的实现

    8. **TreeViewer.java**:可能是用来显示和操作树的视图组件,可能包含了树的渲染和交互逻辑。 9. **console**:可能包含控制台交互的代码,用于通过命令行输入进行树的插入、查找和删除操作。 10. **algorithm**...

    二叉查找树及实现

    二叉查找树(Binary Search Tree,BST)是一种特殊的数据结构,它在计算机科学中用于高效地存储和检索数据。在二叉查找树中,每个节点包含一个键(key)、一个关联值、一个指向左子节点的引用以及一个指向右子节点的...

    二叉搜索树

    二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:每个节点的左子树只包含比当前节点小的元素,而右子树则只包含比当前节点大的元素。这种特性使得二叉搜索树在进行查找、插入和...

    构造二叉排序树

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都满足以下两个性质: 1. 左子树上的所有节点的值均小于该节点的值。 2. 右子树上的所有节点的值均...

    使用Java实现二叉搜索树

    这段代码展示了构建一个基本的二叉搜索树(Binary Search Tree, BST)的实现。二叉搜索树是一种特殊的二叉树,其中每个节点的值大于其左子树中所有节点的值,并且小于其右子树中所有节点的值。这种数据结构在查找、...

    Binary_Search_Tree:用Java实现的二叉搜索树

    二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉搜索树中,对于任意节点,其左子树中的所有...

Global site tag (gtag.js) - Google Analytics