按顺序检查BST

时间:2018-10-03 05:03:59

标签: tree binary-search-tree

我遇到了以下代码,以检查树是否为BST。 请说明使用prev指针的目的以及根数据与prev-> data之间的关系。

bool isBST(struct node* root) 
{ 
    static struct node *prev = NULL; 

    // 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; 
} 

1 个答案:

答案 0 :(得分:0)

顺序遍历的基本定义是

  1. 遍历左侧子树,即调用Inorder(left-subtree)
  2. 访问根。
  3. 遍历右侧子树,即调用Inorder(right-subtree)

让我们以BST为例。

BST

对于上面的树,顺序遍历为[2,5,6,8,10,13,15,19]。基本上,BST的顺序遍历使我们可以按升序排列

因此,在您的代码中,遍历期间将保存前一个节点以将其与当前节点进行比较。比较时,当前节点的数据应严格大于前一节点的数据,因为遍历给出了升序。这就是为什么使用以下条件的原因。

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

如果当前节点的数据(root-> data)小于或等于前一个节点的数据(prev-> data),则该树不是BST。