Tree 使用顺序检查BST

Tree 使用顺序检查BST,tree,binary-search-tree,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-

我遇到了下面的代码来检查树是否为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; 
} 
bool-isBST(结构节点*根)
{ 
静态结构节点*prev=NULL;
//按顺序遍历树并跟踪上一个节点
如果(根)
{ 
如果(!isBST(根->左))
返回false;
//仅允许不同值的节点
if(prev!=NULL&&root->data)
返回false;
prev=根;
返回isBST(根->右);
} 
返回true;
} 

顺序遍历的基本定义是

  • 遍历左子树,即调用顺序(左子树)
  • 访问根
  • 遍历右子树,即调用顺序(右子树)
  • 让我们以BST为例

    对于上面的树,顺序遍历将是[2,5,6,8,10,13,15,19]。基本上,BST的按序遍历以升序给出元素。

    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; 
    } 
    
    因此,在代码中,在遍历过程中,会保存上一个节点以将其与当前节点进行比较。比较时,当前节点的数据应严格大于前一个节点的数据,因为遍历给出了升序。这就是使用以下条件的原因

     if (prev != NULL && root->data <= prev->data) 
                return false; 
    
    if(prev!=NULL&&root->data)
    返回false;
    
    如果当前节点的数据(根->数据)小于或等于上一个节点的数据(上一个->数据),则树不是BST