C++判断一棵树是否为BST(二叉排序树、搜索树)

1. 题目

给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)?

2. 思路

二叉搜索树要求:

  1. 结点node的左子树所有结点的值都小于node的值。
  2. 结点node的右子树所有结点的值都大于node的值。
  3. 结点node的左右子树同样都必须是二叉搜索树

假设如图所示二叉树:

    10
   /  \
  5   15     -------- binary tree (1)
     /  \
    6    20

当我们从结点10遍历到右结点15时,我们知道右子树结点值肯定都在10和+INFINITY(无穷大)之间。当我们遍历到结点15的左孩子结点6时,我们知道结点15的左子树结点值都必须在10到15之间。显然,结点6不符合条件,因此它不是一棵二叉搜索树。

3 代码

#include 
#include 

struct Node {
    int value;
    Node* left;
    Node* right;
    Node(int value):
        value(value), left(nullptr), right(nullptr) {}
};

void preOrderRecur(Node* head) {
    if (head == nullptr) {
        return;
    }
    std::cout << head->value << ",";
    preOrderRecur(head->left);
    preOrderRecur(head->right);
}

bool isBSTUtil(Node* head, int min, int max) {
    if (head == nullptr) {
        return true;
    }
    if (head->value <= min || head->value >= max) {
        return false;
    }
    return isBSTUtil(head->left, min, head->value) &&
           isBSTUtil(head->right, head->value, max);
}

bool isBST(Node* head) {
    if (head == nullptr) {
        return true;
    }
    return isBSTUtil(head, INT_MIN, INT_MAX);
}
int main() {
    Node* head1 = new Node(10);
    head1->left = new Node(5);
    head1->right = new Node(15);
    head1->right->left = new Node(12);
    head1->right->right = new Node(20);
    std::cout << "==============Test1==============";
    std::cout << "\npre-order: ";
    preOrderRecur(head1);
    bool isbst1 = isBST(head1);
    std::cout << "\n" << isbst1 << std::endl;

    Node* head2 = new Node(10);
    head2->left = new Node(5);
    head2->right = new Node(15);
    head2->right->left = new Node(6);
    head2->right->right = new Node(20);
    std::cout << "==============Test2==============";
    std::cout << "\npre-order: ";
    preOrderRecur(head2);
    bool isbst2 = isBST(head2);
    std::cout << "\n" << isbst2 << std::endl;

    Node* head3 = new Node(10);
    head3->left = new Node(5);
    head3->right = new Node(15);
    head3->right->left = new Node(8);
    head3->right->right = new Node(20);
    std::cout << "==============Test3==============";
    std::cout << "\npre-order: ";
    preOrderRecur(head3);
    bool isbst3 = isBST(head3);
    std::cout << "\n" << isbst3 << std::endl;
    return 0;
}

C++判断一棵树是否为BST(二叉排序树、搜索树)_第1张图片
说明我们上述的三棵二叉树分别为:

Test1:

    10
   /  \         
  5   15      
     /  \
    12    20

Test2:

    10
   /  \         
  5   15      
     /  \
    6    20
Test3:

    10
   /  \         
  5   15      
     /  \
    8    20

4. 参考文章

  1. C++ - 内置类型的最大值宏定义
  2. 判定一棵二叉树是否是二叉搜索树

你可能感兴趣的:(C++)