Использование вектора здесь не нужно. Определение того, является ли дерево двоичным деревом поиска, не требует дополнительной памяти, кроме стека для рекурсивных вызовов.
Если вы определяете отдельный алгоритм обхода дерева порядков, который делает реализацию почти тривиальной:
#include <utility>
#include <functional>
template<class T>
struct Node {
T value;
Node *left, *right;
};
template<class T, class F>
bool traverse_inorder(Node<T> const* tree, F&& f) {
return !tree || (
traverse_inorder(tree->left, std::forward<F>(f))
&& f(tree->value)
&& traverse_inorder(tree->right, std::forward<F>(f))
);
}
template<class T, class Pred>
bool is_bst(Node<T> const* tree, Pred&& pred) {
T const* p = 0;
return traverse_inorder(tree, [&p, &pred](T const& next) {
T const* prev = p;
p = &next;
return !prev || !pred(next, *prev);
});
}
template<class T>
bool is_bst(Node<T> const* tree) {
return is_bst(tree, std::less<T>{});
}
int main() {
// bst tree:
// 33
// 20 35
// 10 30
Node<int> n1{10}, n3{30}, n2{20, &n1, &n3}, n5{35}, n4{33, &n2, &n5};
auto tree = &n4;
std::cout << is_bst(tree) << '\n'; // Outputs 1.
// Break bst property.
n4.value = 25;
std::cout << is_bst(tree) << '\n'; // Outputs 0.
}
Чтобы преобразовать дерево в вектор с помощью обхода по порядку, вы можете использовать следующую функцию:
template<class T>
std::vector<T> inorder_to_vector(Node<T> const* tree) {
std::vector<T> v;
traverse_inorder(tree, [&v](T const& t) {
v.push_back(t);
return true;
});
return v;
}