在Java中的二进制搜索树

时间:2020-02-23 14:41:15  来源:igfitidea点击:

二进制搜索树是一种特殊类型的二进制树,具有以下属性。

  • 小于root的节点将在左子树中。
  • 大于root的节点将是正确的子树。
  • 它不应该有重复的节点
  • 左和右子树也应该是二进制搜索树。

允许在二进制搜索树上执行以下操作

  • 寻找
  • 插入

搜索()

在二进制搜索中搜索节点非常简单。
根据要找到的值,我们只需遍历左(如果较小的)和右(如果更大)。

算法:

  • 如果要找到的节点等于root,则搜索成功
  • 如果要找到的节点小于root,则遍历左子树。
  • 如果要找到的节点大于root,则遍历右子树
  • 递归重复上述步骤,直到找到节点。

插入()

插入节点操作也很简单。
根据要插入的节点的值,我们只需将其与root和左(如果较小)或者右(如果更小)的左(如果较小)或者右(如果更大)。

算法:

  • 将根节点作为当前节点
  • 如果要插入节点<root
  • 如果它已经离开了孩子,那就留下了左边
  • 如果它没有左子,请插入节点
  • 如果要插入节点> root
  • 如果它有正确的孩子,遍历右
  • 如果它没有右侧的子,请在此处插入节点。

完整的Java程序:

package org.arpit.theitroad.binarysearchtree;
 
public class BinarySearchTreeMain {
	public static class TreeNode
	{
		int data;
		TreeNode left;
		TreeNode right;
		TreeNode(int data)
		{
			this.data=data;
		}
	}
 
 
	public static boolean search(TreeNode root,TreeNode nodeToBeSearched)
	{
		if(root==null)
			return false;
		if(root.data== nodeToBeSearched.data)
		{
			return true;
		}
		boolean result=false;
 
		if(root.data > nodeToBeSearched.data)
			result=search(root.left,nodeToBeSearched);
		else if(root.data < nodeToBeSearched.data) 
			result= search(root.right,nodeToBeSearched); 
 
		return result; 
	} 
 
	public static TreeNode insert(TreeNode root,TreeNode nodeToBeInserted) 
	{ if(root==null) { 
		root=nodeToBeInserted; return root;
	} if(root.data > nodeToBeInserted.data)
	{
		if(root.left==null)
			root.left=nodeToBeInserted;
		else
			insert(root.left,nodeToBeInserted);
	}
	else if(root.data < nodeToBeInserted.data)
		if(root.right==null)
			root.right=nodeToBeInserted;
		else
			insert(root.right,nodeToBeInserted);
	return root;
	} 
 
	public static void inOrder(TreeNode root)
	{
		if(root==null)
			return;
		inOrder(root.left);
		System.out.print(root.data+" ");
		inOrder(root.right);
	}
	public static void main(String[] args)
	{
 
		//Creating a binary search tree
		TreeNode rootNode=createBinarySearchTree();
		TreeNode node55=new TreeNode(55);
		boolean result=search(rootNode,node55);
		System.out.println("Searching for node 55 : "+result);
		System.out.println("---------------------------");
		TreeNode node13=new TreeNode(13);
		TreeNode root=insert(rootNode,node13);
		System.out.println("Inorder traversal of binary tree after adding 13:");
		inOrder(root);
 
	} 
 
	public static TreeNode createBinarySearchTree()
	{
		TreeNode rootNode =new TreeNode(40);
		TreeNode node20=new TreeNode(20);
		TreeNode node10=new TreeNode(10);
		TreeNode node30=new TreeNode(30);
		TreeNode node60=new TreeNode(60);
		TreeNode node50=new TreeNode(50);
		TreeNode node70=new TreeNode(70);
		TreeNode node5=new TreeNode(5);
		TreeNode node55=new TreeNode(55);
 
		insert(null,rootNode);
		insert(rootNode,node20);
		insert(rootNode,node10);
		insert(rootNode,node30);
		insert(rootNode,node60);
		insert(rootNode,node50);
		insert(rootNode,node70);
		insert(rootNode,node5);
		insert(rootNode,node55);
		return rootNode;
	}
 
}

运行上面的程序时,我们将得到以下输出:

Searching for node 55 : true
--------------------------
Inorder traversal of binary tree after adding 13:
5 10 13 20 30 40 50 55 60 70