c++ - BST isBST() 解释

标签 c++ binary-search-tree

所以我在这个网站上找到了这个 isBST() 函数:

static struct node *prev = NULL;

bool isBST(struct node* root)
{
    // traverse the tree in inorder fashion and keep track of prev node
    if (root)
    {
        if (!isBST(root->left))
          return false;

        // Allows only distinct valued nodes
        if (prev != NULL && root->data <= prev->data)
          return false;

        prev = root;

        return isBST(root->right);
    }

    return true;
}

我在跟踪发生的事情时遇到了一些麻烦。主要是

 if (!isBST(root->left))
          return false;

if (prev != NULL && root->data <= prev->data)
              return false;

if (prev != NULL && root->data <= prev->data)出于某种原因对我来说似乎倒退了。我认为应该是 if (prev != NULL && root->data >= prev->data)因为如果 root->data更大,那么它将是错误的。我知道我们正在按顺序遍历树并检查它是否按顺序排列。然而,让我感到困惑的是每一行实际上在做什么。

有人可以详细说明这个函数是怎么回事吗?谢谢

最佳答案

首先,如果我们发现矛盾,我们可以立即返回 false - 将其视为短路。此时树的其余部分无关紧要。

这两个 isBST 调用是有序遍历递归的简单部分。

当我们按顺序进行时,值严格递增(无重复)。所以如果我们看到不匹配,我们可以返回 false,所以这是正确的条件:

root->data <= prev->data


我无法在评论中设置示例格式,所以我在此处留下了一个显示@JerryCoffin 的解决方案将在何处失败的示例:

    3
   / \ 
  2   5
 / \
1   4 

关于c++ - BST isBST() 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33483751/

相关文章:

c++ - 为什么在打印 BST 的前序遍历时我的程序什么都不做

c - 在二叉搜索树上找到第一个大于 X 的键

c++ - 通过实现堆栈实现二叉搜索树的非递归析构函数

c++ - chdir 到 C++ macOS 应用程序中 .app 包的位置

c++ - 数据类型转换

c++ - 在 OpenGL 2.1 中,即使在 2d 空间(具有 2D 纹理)中使用 3D tex 坐标是否安全?

c++ - 在 C++ 中比较数组

c++ - 是否有一个示例如何使用 SWIG 通过 go build 生成 C++ 建筑?

algorithm - 如何用单个分支平衡树?

java - 我的 setter 未设置