在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