입력으로 바이너리 트리가 제공됩니다. 목표는 내부에 하위 트리로 존재하는 이진 탐색 트리(BST)의 수를 찾는 것입니다. BST는 왼쪽 자식이 루트보다 작고 오른쪽 자식이 루트보다 큰 이진 트리입니다.
예를 들어
입력
값을 입력한 후 생성될 트리는 다음과 같습니다. -

출력
Count the Number of Binary Search Trees present in a Binary Tree are: 2
설명
우리는 이진 트리를 형성하는 데 사용되는 정수 값의 배열이 제공되며 그 안에 이진 검색 트리가 있는지 여부를 확인할 것입니다. 모든 루트 노드는 이진 탐색 트리를 나타내므로 주어진 이진 트리에서 다른 이진 탐색 트리가 존재하지 않음을 알 수 있으므로 개수는 이진 트리의 총 리프 노드 수인 2입니다.
입력
값을 입력한 후 생성될 트리는 다음과 같습니다. -

출력
Count the Number of Binary Search Trees present in a Binary Tree are: 6
설명
우리는 이진 트리를 형성하는 데 사용되는 정수 값의 배열이 제공되며 그 안에 이진 검색 트리가 있는지 여부를 확인할 것입니다. 모든 루트 노드는 이진 탐색 트리를 나타내므로 주어진 이진 트리에서 BST를 형성하는 4개의 리프 노드와 2개의 하위 트리가 있음을 알 수 있으므로 개수는 6입니다.


아래 프로그램에서 사용된 접근 방식은 다음과 같습니다 -
이 접근 방식에서 우리는 노드 N의 왼쪽 서브트리에서 노드의 가장 큰 값을 찾아 N보다 작은지 확인합니다. 또한 노드 N의 오른쪽 서브트리에서 가장 작은 값을 찾아 보다 큰지 확인합니다. N. 참이면 BST입니다. 이진 트리를 상향식으로 순회하고 위의 조건을 확인하고 BST의 수를 증가시킵니다.
-
모든 node_data의 노드에는 존재하는 BST의 수, 해당 트리의 최대값, 최소값, 부울 하위 트리가 BST인 경우 참과 같은 정보가 포함됩니다.
-
BST_present(struct tree_node* parent) 함수는 부모에 뿌리를 둔 바이너리 트리 내부에 존재하는 BST의 개수를 찾습니다.
-
부모가 NULL이면 { 0, min, max, true }를 반환합니다. 여기서 min은 INT-MIN이고 max는 INT_MAX입니다.
-
왼쪽 및 오른쪽 자식이 null이면 { 1, parent->data, parent->data, true }
를 반환합니다. -
node_data 왼쪽 설정 =BST_present(parent->left); 및 node_data Right =BST_present(parent->right);
-
노드 n1을 선택하고 n1.lowest =min(parent->data, (min(Left.lowest,Right.lowest)))를 오른쪽 하위 트리에서 가장 낮은 값으로 설정합니다.
-
설정 n1.highest =max(parent->data, (max(Left.highest, Right.highest))); 왼쪽 하위 트리에서 가장 높습니다.
-
if(Left.check &&Right.check &&parent−>data> Left.highest &&parent−>data
-
bst 수를 n1.total_bst =1 + Left.total_bst + Right.total_bst로 늘리십시오.
-
그렇지 않으면 n1.check =false로 설정하고 n1.total_bst =Left.total_bst +Right.total_bst로 계산합니다.
-
끝에 n1을 반환합니다.
예시
#include <bits/stdc++.h>
using namespace std;
struct tree_node{
struct tree_node* left;
struct tree_node* right;
int data;
tree_node(int data){
this−>data = data;
this−>left = NULL;
this−>right = NULL;
}
};
struct node_data{
int total_bst;
int highest, lowest;
bool check;
};
node_data BST_present(struct tree_node* parent){
if(parent == NULL){
int max = INT_MAX;
int min = INT_MIN;
return { 0, min, max, true };
}
if(parent−>left == NULL){
if(parent−>right == NULL){
return { 1, parent−>data, parent−>data, true };
}
}
node_data Left = BST_present(parent−>left);
node_data Right = BST_present(parent−>right);
node_data n1;
n1.lowest = min(parent−>data, (min(Left.lowest, Right.lowest)));
n1.highest = max(parent−>data, (max(Left.highest, Right.highest)));
if(Left.check && Right.check && parent−>data > Left.highest && parent−>data < Right.lowest){
n1.check = true;
n1.total_bst = 1 + Left.total_bst + Right.total_bst;
} else{
n1.check = false;
n1.total_bst = Left.total_bst + Right.total_bst;
}
return n1;
}
int main(){
struct tree_node* root = new tree_node(3);
root−>left = new tree_node(7);
root−>right = new tree_node(4);
root−>left−>left = new tree_node(5);
root−>right−>right = new tree_node(1);
root−>left−>left−>left = new tree_node(10);
cout<<"Count the Number of Binary Search Trees present in a Binary Tree are: "<<BST_present(root).total_bst;
return 0;
} 출력
위의 코드를 실행하면 다음 출력이 생성됩니다 -
Count the Number of Binary Search Trees present in a Binary Tree are: 2