두 갈래 트리가 두 갈래 검색 트리인지 판단하기 BST

1857 단어
하나,
/* Returns true if the given tree is a binary search tree
 (efficient version). */
int isBST(struct node* node)
{
    return(isBSTUtil(node, INT_MIN, INT_MAX));
}

/* Returns true if the given tree is a BST and its
   values are >= min and <= max. */
int isBSTUtil(struct node* node, int min, int max)
{

    /* an empty tree is BST */
    if (node==NULL)
        return 1;

    /* false if this node violates the min/max constraint */
    if (node->data < min || node->data > max)
        return 0;

    /* otherwise check the subtrees recursively,
     tightening the min or max constraint */
    return
        isBSTUtil(node->left, min, node->data-1) &&  // Allow only distinct values
        isBSTUtil(node->right, node->data+1, max);  // Allow only distinct values
}

2. 중서 두루 훑어보다
1) Do In-Order Traversal of the given tree and store the result in a temp array. 2) Check if the temp array is sorted in ascending order, if it is, then the tree is BST.
Time Complexity: O(n)
We can avoid the use of Auxiliary Array. While doing In-Order traversal, we can keep track of previously visited node. If the value of the currently visited node is less than the previous value, then tree is not BST. 
bool isBST(struct node* root)
{
    static struct node *prev = NULL;  //static !!!
     
    // 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;
}
참조:http://cslibrary.stanford.edu/110/BinaryTrees.html

좋은 웹페이지 즐겨찾기