判断二叉树是否为二叉搜索树
判断方法
- 中序遍历时,判断左中右数值是否依次升序
- 非递归方法使用stack
- 左孩子大于根节点,false
- 右孩子小于根节点,false
代码
#include <iostream>
#include <queue>
#include <stack>
struct Node {
int value;
Node* parent;
Node* left;
Node* right;
Node(int v = 0): value(v), parent(nullptr), left(nullptr), right(nullptr) {}
};
void destroy_tree(Node* root) {
if (root == nullptr) {
return;
}
destroy_tree(root->left);
destroy_tree(root->right);
delete root;
}
bool is_bsTree(Node* root) {
if (root == nullptr) {
return true;
}
std::stack<Node*> s;
while(!s.empty() || root != nullptr) {
if(root != nullptr) {
s.push(root);
root = root->left;
} else {
root = s.top();
s.pop();
if (!s.empty() && root->value > s.top()->value) {
return false;
}
root = root->right;
if (!s.empty() && root != nullptr && root->value < s.top()->value) {
return false;
}
}
}
return true;
}
int main(void)
{
Node* head1 = new Node(5);
Node* node11 = new Node(4);
Node* node12 = new Node(6);
Node* node13 = new Node(3);
Node* node14 = new Node(1);
Node* node15 = new Node(2);
head1->left = node11;
head1->right = node12;
node11->left = node13;
node11->right = node14;
node12->left = node15;
std::cout << "is search binary tree ---> is_SBTree(head1) "
<< std::boolalpha << is_SBTree(head1) << std::endl;
destroy_tree(head1);
return 0;
}