树、二叉树、二叉搜索树_检查二叉树是否为BST(二叉搜索树)

树、二叉树、二叉搜索树

Description:

描述:

This article describes how to check whether a given tree is BST or not? This problem came in coding round of Microsoft.

本文介绍如何检查给定的树是否是BST ? 这个问题来自微软的编码回合。

Problem Statement:

问题陈述:

Given a binary tree check whether it is a binary search tree or not.

给定二叉树,请检查它是否为二叉搜索树。

Solution

Algorithm:

算法:

From the definition of BST, it may seem that for a binary tree to be BST, it’s enough to check for each node if the node on its left is smaller & node on its right is greater. But this is actually the wrong approach since it will give wrong output for many test-cases.

从BST的定义来看,对于一棵二叉树来说,似乎BST足以检查每个节点,如果其左侧的节点较小,而其右侧的节点较大。 但这实际上是错误的方法,因为它将为许多测试用例提供错误的输出。

The correct algorithm is to check for each node whether the maximum of the left subtree is lesser than the node & the minimum of the right subtree is greater than the node. This algorithm works perfect but not efficient in terms of time complexity.

正确的算法是检查每个节点的左子树的最大值是否小于该节点,以及右子树的最小值是否大于该节点。 该算法在时间复杂度方面工作完美,但效率不高。

Intuition says that the in-order traversal for the BST results in a sorted list of nodes and we use this in our algorithm.

直觉说BST的有序遍历会导致节点的排序列表,我们在算法中使用了它。

1.  Set prev to INT_MIN.
2.  From main function call checkBST(root, prev)
    //passing prev by reference to update it every time
    checkBST(root, &prev) 
3.  if(root==NULL) 
        return 1; //null tree is BST
4.  do in-order traversal and checking whether all tree node 
    data is sorted or not
    if(!(checkBST(root->left,prev)))  //check left subtree 
        return 0;
    //root->data must be greater than prevsince BST results in 
    //sorted list after in-order traversal.
5.  if(root->data<prev) 
        return 0;
6.  prev=root->data; //update prev value
7.  return checkBST(root->right,prev);//check right subtree


Example 1:

范例1:

tree 2 image in DS

Clearly Example 1 is a binary search tree. We will check out further through our function.

显然,示例1是一个二进制搜索树。 我们将通过功能进一步检查。

Example 2:

范例2:

tree 3 image in DS

Clearly Example 2 is not a binary tree. We will check out through our function.

显然,示例2不是二叉树。 我们将通过我们的功能签出。

树的C ++类实现 (C++ class implementation for tree)

// tree node is defined
class tree{    
	public:
		int data;
		tree *left;
		tree *right;
};

C ++函数checkBST实现 (C++ function checkBST for implementation)

//passing reference of prev
int checkBST(tree* root,int &prev){ 
	//null tree is BST
	if(root==NULL) 
		return 1;
	//doing inorder traversal and checking whether 
	//all tree node data is sorted or not
	if(!(checkBST(root->left,prev))) 
		return 0;
	if(root->data<prev)
		return 0;
	prev=root->data; //update prev value

	return checkBST(root->right,prev);
}

用于创建树节点的C ++实现 (C++ implementation for creating tree nodes)

// creating new node
tree* newnode(int data)  
{ 
	tree* node = (tree*)malloc(sizeof(tree)); 
	node->data = data; 
	node->left = NULL; 
	node->right = NULL; 

	return(node); 
} 


主驱动程序功能例如 (Main driver function for example1)

#include <bits/stdc++.h>
using namespace std;

int main() 
{ 
	//**same tree is builted as shown in example**
	int c,prev=INT_MIN;//prev initialized to INT_MIN
	cout<<"Tree is built like the example 1 aforesaid"<<endl;

	tree *root=newnode(8); 
	root->left= newnode(3); 
	root->right= newnode(10); 
	root->right->right=newnode(14);
	root->right->right->left=newnode(13);
	root->left->left=newnode(1); 
	root->left->right=newnode(6);
	root->left->right->left=newnode(4);
	root->left->right->right=newnode(7);

	cout<<"builting the binary tree like example 1......"<<endl; 
	c=checkBST(root,prev);
	if(c)
		cout<<"This binary tree is binary search tree"<<endl;
	else
		cout<<"This is not a binary search tree";

	return 0; 
} 

主驱动程序功能例如 (Main driver function for example2)

#include <bits/stdc++.h>
using namespace std;

int main() 
{ 
	//**same tree is builted as shown in example**
	int c,prev=INT_MIN;//prev initialized to INT_MIN
	cout<<"Tree is built like the example 2 aforesaid"<<endl;

	tree *root=newnode(2); 
	root->left= newnode(7); 
	root->right= newnode(5); 
	root->right->right=newnode(9);
	root->right->right->left=newnode(4);
	root->left->left=newnode(2); 
	root->left->right=newnode(6);
	root->left->right->left=newnode(5);
	root->left->right->right=newnode(11);

	cout<<"builting the binary tree like example 2......"<<endl; 
	c=checkBST(root,prev);
	if(c)
	cout<<"This binary tree is binary search tree"<<endl;
	else
	cout<<"This is not a binary search tree";

	return 0; 
} 

Output 1

输出1

Tree is built like the example 1 aforesaid 
builting the binary tree like example 1......
This binary tree is binary search tree

Output 2

输出2

Tree is built like the example 2 aforesaid 
builting the binary tree like example 2......
This is not a binary search tree 


翻译自: https://www.includehelp.com/icp/check-whether-a-binary-tree-is-bst-binary-search-tree-or-not.aspx

树、二叉树、二叉搜索树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值