-
Notifications
You must be signed in to change notification settings - Fork 253
/
Binary search tree - Is BST.cpp
143 lines (126 loc) · 2.78 KB
/
Binary search tree - Is BST.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
#include<queue>
#include<climits>
using namespace std;
class node{
public:
int data;
node*left;
node*right;
node(int d){
data = d;
left = NULL;
right = NULL;
}
};
//Accepts the old root node & data and returns the new root node
node* insertInBST(node *root,int data){
//Base Case
if(root==NULL){
return new node(data);
}
//Rec Case - Insert in the Subtree and Update Pointers
if(data<=root->data){
root->left = insertInBST(root->left,data);
}
else{
root->right = insertInBST(root->right,data);
}
return root;
}
node* build(){
//Read a list of numbers till -1 and also these numbers will be inserted into BST
int d;
cin>>d;
node*root = NULL;
while(d!=-1){
root = insertInBST(root,d);
cin>>d;
}
return root;
}
//Inorder Print
void inorder(node*root){
if(root==NULL){
return;
}
inorder(root->left);
cout<<root->data<<",";
inorder(root->right);
}
//searching
/*bool search(node* root,int data){
if(root==NULL){
return false;
}
if(root->data==data){
return true;
}
//recursively search in left and right subtree
if(data<=root->data){
return search(root->left,data);
}
else{
return search(root->right,data);
}
}*/
/*node* delete_in_bst(node* root,int data){
if(root==NULL){
return NULL;
}
else if(data<root->data){
root->left=delete_in_bst(root->left,data);
}
else if(data==root->data){
//found the nodes to delete 3 cases
//1. node with 0 children-leaf node
if(root->left==NULL and root->right==NULL){
delete root;
return NULL;
}
//2.only one child
if(root->left!=NULL and root->right==NULL){
node *temp=root->left;
delete root;
return temp;
}
if(root->right!=NULL and root->left==NULL){
node *temp=root->right;
delete root;
return temp;
}
//3. Node with two children
//find the node to replace
node *replace=root->right;
while(replace->left!=NULL){
replace=replace->left;
}
root->data=replace->data;
root->right=delete_in_bst(root->right,replace->data);
return root;
}
else{
root->right=delete_in_bst(root->right,data);
}
}*/
bool is_bst(node *root,int minV=INT_MIN,int maxV=INT_MAX){
if(root==NULL){
return true;
}
if(root->data>=minV and root->data<=maxV and is_bst(root->left,minV,root->data) and is_bst(root->right,root->data,maxV)){
return true;
}
return false;
}
int main(){
node*root = build();
inorder(root);
cout<<endl;
if(is_bst(root)){
cout<<"YES"<<endl;
}
else{
cout<<"NOT A BST!"<<endl;
}
return 0;
}