#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<stdbool.h>
typedef struct node {
int val;
struct node *next;
} node;
typedef struct Treenode {
int val;
struct Treenode *left;
struct Treenode *right;
} Treenode;
Treenode *createnode(){
Treenode *totree = (Treenode*)malloc(sizeof(Treenode));
totree->left=NULL;
totree->right=NULL;
return totree;
}
void InOrder(Treenode *root){
if(!root) return;
InOrder(root->left);
printf("%d ",root->val);
InOrder(root->right);
}
void preOrder(Treenode *root){
if(!root) return;
printf("%d ",root->val);
preOrder(root->left);
preOrder(root->right);
}
void PostOrder(Treenode *root){
if(!root) return;
PostOrder(root->left);
PostOrder(root->right);
printf("%d ",root->val);
}
Treenode *arrayTotree(int *a, int size ,int i){
if(i>=size) return NULL;
Treenode *root=createnode();
root->val=a[i];
root->left=arrayTotree(a,size,2*i+1);
root->right=arrayTotree(a,size,2*i+2);
return root;
}
bool isMirror_help(Treenode *p,Treenode *q){
if(!p && !q) return true;
else if(!p || !q) return false;
if(p->val != q->val) return false;
return isMirror_help(p->left,q->right) && isMirror_help(p->right,q->left);
}
bool isMirror(Treenode *root){
if(!root) return true;
return isMirror_help(root->left,root->right);
}
int treeHeight(Treenode *root){
if(!root) return 0;
int con1=treeHeight(root->left);
int con2=treeHeight(root->right);
return 1+((con1>con2)?con1:con2);
}
Treenode *LCA(Treenode *root,int x,int y){
if(!root) return NULL;
if(root->val==x || root->val==y) return root;
Treenode *node1 = LCA(root->left,x,y);
Treenode *node2 = LCA(root->right,x,y);
if(node1 && node2) return root;
if(!node1) return node2;
return node1;
}
int size_BST(Treenode *root){
if(!root) return 0;
return 1+size_BST(root->left)+size_BST(root->right);
}
Treenode *search_BST(Treenode *root , int key){
if(!root) return NULL;
if(root->val>key)
return search_BST(root->left,key);
if(root->val<key)
return search_BST(root->right,key);
return root;
}
bool isBST_help(Treenode *root,int min,int max){
if(!root) return true;
if(root->left && root->left->val>=root->val) return false;
if(root->right && root->right->val<=root->val) return false;
if(root->val<=min || root->val>=max) return false;
return isBST_help(root->left,min,root->val) && isBST_help(root->right,root->val,max);
}
bool isBST(Treenode *root){
return isBST_help(root,INT_MIN,INT_MAX);
}
int main(){
Treenode *root = createnode();
root->val = 8;
Treenode *left1 = createnode();
left1->val = 4;
root->left = left1;
Treenode *right1 = createnode();
right1->val = 12;
root->right = right1;
Treenode *left2 = createnode();
left2->val = 2;
left1->left = left2;
Treenode *right2 = createnode();
right2->val = 6;
left1->right = right2;
Treenode *left3 = createnode();
left3->val = 1;
left2->left = left3;
Treenode *right3 = createnode();
right3->val = 3;
left2->right = right3;
Treenode *left4 = createnode();
left4->val = 5;
right2->left = left4;
Treenode *right4 = createnode();
right4->val = 7;
right2->right = right4;
Treenode *right5 = createnode();
right5->val = 10;
right1->left = right5;
Treenode *right6 = createnode();
right6->val = 14;
right1->right = right6;
Treenode *left5 = createnode();
left5->val = 9;
right5->left = left5;
Treenode *right7 = createnode();
right7->val = 11;
right5->right = right7;
Treenode *left6 = createnode();
left6->val = 13;
right6->left = left6;
Treenode *right8 = createnode();
right8->val = 15;
right6->right = right8;
InOrder(root);
printf("\n");
printf("%d\n",size_BST(root));
if(isBST(root)) printf("NICE\n");
}