树、二叉树、二叉搜索树
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:
Clearly Example 1 is a binary search tree. We will check out further through our function.
显然,示例1是一个二进制搜索树。 我们将通过功能进一步检查。
Example 2:
范例2:
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
树、二叉树、二叉搜索树