判断某个树是否是二叉排序树或者镜像二叉排序树的前序序列
#include <iostream>
#include <vector>
using namespace std;
bool flag = true;
bool flag1 = true;
bool flag2 = true;
typedef struct Node {
int data;
struct Node* lchild;
struct Node* rchild;
}*Tree;
//判断是否是二叉搜索树 找到比第一个大于数组首元素的下标 如果后面的值 都大于等于此下标的值 则是二叉搜索树
//二叉镜像搜索树则反之
Tree judgeSearchTree(int *arr,int n)
{
if (!n)
return nullptr;
Tree T = new Node;
T->data = arr[0];
int i;
for (i = 1; i < n; i++)
{
if (arr[i] >= arr[0])
break;
}
for (int j = i; j < n; j++)
{
if (arr[0] > arr[j])
{
flag1 = false;
return nullptr;
}
}
T->lchild = judgeSearchTree(arr + 1, i - 1);
T->rchild = judgeSearchTree(arr + i, n - i);
return T;
}
Tree judgeMirrorSearchTree(int* arr, int n)
{
if (!n)
return nullptr;
Tree T = new Node;
T->data = arr[0];
int i = 0;
for (i = 1; i < n; i++)
{
if (arr[i] < arr[0])
break;
}
for (int j = i; j < n; j++)
{
if (arr[0] <= arr[j])
{
flag2 = false;
return nullptr;
}
}
T->lchild = judgeMirrorSearchTree(arr + 1, i - 1);
T->rchild = judgeMirrorSearchTree(arr + i, n - i);
return T;
}
void postOrder(Tree T)
{
if (T)
{
postOrder(T->lchild);
postOrder(T->rchild);
if (flag)
{
flag = false;
}
else
{
cout << " ";
}
cout << T->data ;
}
}
int main()
{
int arr[1005];
int n;
cin >> n;
int data;
for (int i = 0; i < n; i++)
{
cin >> data;
arr[i] = data;
}
Tree T1 = judgeSearchTree(arr, n);
Tree T2 = judgeMirrorSearchTree(arr, n);
if (flag1 && T1)
{
cout << "YES" << endl;
postOrder(T1);
cout << endl;
}
else if (flag2 && T2)
{
cout << "YES" << endl;
postOrder(T2);
cout << endl;
}
else
{
cout << "NO" << endl;
}
return 0;
}