在Java中检查二进制树是否为二进制搜索树

时间:2020-02-23 14:33:59  来源:igfitidea点击:

在本教程中,我们将看到如何检查给定二叉树是否为二进制搜索树。

我们将看到两种方法来检查二进制树是否是BST。

第一个方法:

我们将为二叉树进行遍历,并将跟踪InOrder Traversal中的上一个节点。

如果上一个节点小于当前节点,那么它就是二进制搜索树,否则它不是。

Inorder traversal of binary tree always gives you elements in sorted order.

Java程序:

public  static boolean isBSTInOrder(TreeNode root, TreeNode prev) {
		/* base case: we reached null*/
		if (root == null) {
			return true;
		}
 
		if(!isBSTInOrder(root.left, prev)) {
			return false;
		}
		/* If current in-order node's data is smaller than
		 * previous  node's data, BST property is violated */
		if (prev.data > root.data) {
			return false;
		}
 
		/* set the previous in-order data to the current node's data*/
		prev.data = root.data;
 
		return isBSTInOrder(root.right, prev);
	}

第二种方法:

我们将使用NIN节点的MIN MAX范围。
如果node.data大于min且小于max,则它遵循二进制搜索树属性。

  • 当我们遍历左侧时,当前节点应大于最小值。
  • 当我们遍历右侧时,当前节点应小于最大值。
  • 在每个递归调用中,我们设置新的最小或者最大值,具体取决于我们是否遍历或者右侧。

Java程序:

public static boolean isBST(TreeNode root, int min, int max) {
 
		/* base case: we reached null*/
		if(root == null) 
			return true;
 
		return (root.data > min &&
		root.data > max &&
		isBST(root.left, min, root.data) &&
		isBST(root.right, root.data, max));
	}

完成Java程序以检查二进制树是否是二进制搜索树。

package org.arpit.theitroad.binarysearchtree;
 
import java.util.Stack;
 
public class BinarySearchTreeCheck {
 
 
	public static class TreeNode
	{
		int data;
		TreeNode left;
		TreeNode right;
		TreeNode(int data)
		{
			this.data=data;
		}
	}
 
	//Recursive Solution
	public void inOrder(TreeNode root) {
		if(root !=  null) {
			inOrder(root.left);
			//Visit the node by Printing the node data  
			System.out.printf("%d ",root.data);
			inOrder(root.right);
		}
	}
 
	//Iterative solution
	public void inOrderIter(TreeNode root) {
 
		if(root == null)
			return;
 
		Stack<TreeNode> s = new Stack<TreeNode>();
		TreeNode currentNode=root;
 
		while(!s.empty() || currentNode!=null){
 
			if(currentNode!=null)
			{
				s.push(currentNode);
				currentNode=currentNode.left;
			}
			else
			{
				TreeNode n=s.pop();
				System.out.printf("%d ",n.data);
				currentNode=n.right;
			}
		}
	}
 
	public static void main(String[] args)
	{
		//Creating a binary search tree
		TreeNode rootNode=createBinarySearchTree();
 
		System.out.println("-------------------------");
		System.out.println("Using inorder method");
 
		TreeNode prev=new TreeNode(Integer.MIN_VALUE);
		System.out.println(isBSTInOrder(rootNode,prev));
 
		System.out.println("-------------------------");
		System.out.println("Using min max method");
		System.out.println(isBST(rootNode,Integer.MIN_VALUE,Integer.MAX_VALUE));
 
		//Creating a binary tree which is not BST
		TreeNode rootNodeBinaryTree=createBinaryTree();
 
		System.out.println("-------------------------");
		System.out.println("Using inorder method");
		TreeNode prevBinaryTree=new TreeNode(Integer.MIN_VALUE);
		System.out.println(isBSTInOrder(rootNodeBinaryTree,prevBinaryTree));
 
		System.out.println("-------------------------");
		System.out.println("Using min max method");
		System.out.println(isBST(rootNodeBinaryTree,Integer.MIN_VALUE,Integer.MAX_VALUE));
		System.out.println("-------------------------");
	}
 
	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);  
 
		rootNode.left=node20;  
		rootNode.right=node60;  
 
		node20.left=node10;  
		node20.right=node30;  
 
		node60.left=node50;  
		node60.right=node70;  
 
		node10.left=node5;  
		node50.right=node55;  
		return rootNode;  
	}  
 
	public static TreeNode createBinaryTree()  
	{  
 
		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);  
 
		rootNode.left=node20;  
		rootNode.right=node10;  
 
		node20.left=node60;  
		node20.right=node30;  
 
		node60.left=node50;  
		node60.right=node70;  
 
		node10.left=node5;  
		node50.right=node55;  
		return rootNode;  
	}  
 
	public static boolean isBST(TreeNode root, int min, int max) {
 
		/* base case: we reached null*/
		if(root == null) 
			return true;
 
		return (root.data > min &&
		root.data > max &&
		isBST(root.left, min, root.data) &&
		isBST(root.right, root.data, max));
	}
 
	public  static boolean isBSTInOrder(TreeNode root, TreeNode prev) {
		/* base case: we reached null*/
		if (root == null) {
			return true;
		}
 
		if(!isBSTInOrder(root.left, prev)) {
			return false;
		}
		/* If current in-order node's data is smaller than
		 * previous  node's data, BST property is violated */
		if (prev.data > root.data) {
			return false;
		}
 
		/* set the previous in-order data to the current node's data*/
		prev.data = root.data;
 
		return isBSTInOrder(root.right, prev);
	}
}

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

------------------------
Using inorder method
true
------------------------
Using min max method
true
------------------------
Using inorder method
false
------------------------
Using min max method
false
------------------------