📜  BST 与否? - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:39:35.972000             🧑  作者: Mango

判断BST(二叉搜索树)与否 - C 编程语言

本篇文章将介绍如何判断一棵二叉树是否为二叉搜索树(BST, Binary Search Tree)。我们将编写 C 语言代码来实现这一目标。

什么是二叉搜索树?

二叉搜索树是一种树形数据结构,其中每个节点最多只有两个子节点。它的特点之一是,每个节点的键值大于其左子树中的任何节点,并且小于其右子树中的任何节点。这意味着该树可以被用于查找,插入和删除数据,具有高效的复杂度。

如何判断一棵二叉树是否为BST?

我们可以通过对每个节点访问的值进行比较来判断一棵二叉树是否为BST。对于每个节点,我们需要检查它的值是否大于该节点的左子树中的任何节点,并且小于右子树中的任何节点。如果这个条件满足,则我们可以往下检查左右子树,以确保它们也满足该条件。

递归实现

我们可以使用递归来遍历树中的每个节点,并检查它们是否满足 BST 的条件。下面是一个递归实现:

#include <stdbool.h>

typedef struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

bool isValidBSTUtil(TreeNode* root, long min, long max)
{
    if (!root) {
        return true;
    }
    if (root->val <= min || root->val >= max) {
        return false;
    }
    return isValidBSTUtil(root->left, min, root->val) 
        && isValidBSTUtil(root->right, root->val, max);
}

bool isValidBST(TreeNode* root) {
    return isValidBSTUtil(root, LONG_MIN, LONG_MAX);
}

该递归函数 isValidBSTUtil 接收三个参数:当前节点,该节点可以具有的最小值和最大值。如果当前节点为 NULL,则说明该子树满足 BST 的条件,我们返回 true。否则,我们检查该节点的值是否大于其左子树中的任何节点,并且小于其右子树中的任何节点。如果该条件不满足,则说明该子树不是 BST,我们返回false。最后,我们递归调用该函数来检查左右子树,以确保它们也满足该条件。

isValidBST 函数只是一个简单的包装函数,它调用 isValidBSTUtil 函数并传递一个最小值和最大值范围(这里我们使用了 long 类型的最小值和最大值来确保该函数可以处理任何整数)。

迭代实现

我们也可以使用迭代的方式来实现上述算法。下面是一个迭代的实现:

bool isValidBST(TreeNode* root) {
    if (!root) {
        return true;
    }
    long pre = LONG_MIN;
    bool first = true;
    struct TreeNode* stack[10000];
    int top = -1;
    struct TreeNode* p = root;
    while (p || top != -1) {
        while (p) {
            stack[++top] = p;
            p = p->left;
        }
        p = stack[top--];
        if (first) {
            pre = p->val;
            first = false;
        } else {
            if (p->val <= pre) {
                return false;
            }
            pre = p->val;
        }
        p = p->right;
    }
    return true;
}

该迭代实现使用了一个栈来存储尚未处理的节点。我们从树的最左侧节点开始,将所有左侧节点压入栈中。然后我们弹出一个节点,并检查它是否大于前一个节点的值。如果满足该条件,则更新前一个节点的值,并将右子树中的节点压入栈中。重复这个过程,直到栈为空并且所有节点都被处理。

总结

在本篇文章中,我们学习了如何判断一棵二叉树是否为 BST。我们使用了递归和迭代两种不同的方法来实现该算法。这是一种非常有用的算法,因为 BST 是数据结构中的常见类型,并且在实际编程中经常被使用。