如何判断一棵树是BST树

来源:互联网 发布:漂流的浴室知乎 编辑:程序博客网 时间:2024/04/30 02:19
先想到的是利用BST树的性质——中序遍历递增,但是我现在还不能 确定是否这样就能判断,先把这种算法算作一种算法,不对的话,多谢大家帮忙指正:)

1.中序遍历递增

想法:利用双指针,一个指向前驱一个指向当前节点,比较他们的大小

bool isBST(Node * node){        if ( node== NULL)              return true;         //如果左子树最大值大于根节点,则返回false        if (node->left != NULL && maxValue( node->left) > node->data)              return false;         //如果右子树最小值小于根节点,则返回false        if (node->right != NULL && minValue( node->right) < node->data)              return false;         //递归判断        if (!isBST(node->left) || !isBST( node->right))              return false;         //所有检测都通过,是BST        returntrue;}

时间复杂度:O(n)

2.利用定义:BST树是树中任意的一个节点元素都满足比它的左子树所有元素大,比他的右子树所有元素小【可以看出,只根据一个节点比左孩子大右孩子小判断树是BST树是错误的】

所以判断节点比左子树中的最大值大,比右子树中的最小值小。

bool isBST(Node * node){        if ( node== NULL)              return true;         //如果左子树最大值大于根节点,则返回false        if (node->left != NULL && maxValue( node->left) > node->data)              return false;         //如果右子树最小值小于根节点,则返回false        if (node->right != NULL && minValue( node->right) < node->data)              return false;         //递归判断        if (!isBST(node->left) || !isBST( node->right))              return false;         //所有检测都通过,是BST        returntrue;}



3.

方法2因为要重复的遍历树中的部分数据,效率比较低。更好的方案是每个节点只遍历一次。方法3的巧妙之处在于限定了子树中节点值的范围,从而每个节点只需访问一次。节点值的初始范围可限定为INT_MIN以及INT_MAX。
//判断是否为BST
bool isBST(Node* node)
{
return(isBSTUtil(node, INT_MIN, INT_MAX));
}
//如果是一颗二叉查找树,且值范围在[min,max],则返回true
bool isBSTUtil(Node* node, int min, int max)

代码实现:

 

 

 

 


 

 

#include <iostream> struct Node{        int key;        Node*left;        Node*right;}; bool isBSTUtil(Node * node, int min, int max); //判断是否为BSTbool isBST(Node * node ){       return(isBSTUtil( node, INT_MIN, INT_MAX));} //如果是一颗二叉查找树,且值范围在[min, max],则返回truebool isBSTUtil(Node * node , int min , int max ){        //空树也是BST        if (node == NULL)              return true;         //如果节点值违反了最大/最小约束条件,则不是BST        if (node->key < min || node->key > max)              return false;         //递归检查子树       return  isBSTUtil( node->left,min, node->key - 1) &&             isBSTUtil( node->right, node->key + 1, max);}  // 创建一个新的BST节点Node *createNewNode(int item ){        Node*temp = new Node;      temp->key = item;      temp->left = temp->right = NULL;        returntemp;}  int main(){    /* tree1的定义            4          /           2     5        /       1   3    */       Node*root = createNewNode(4);      root->left = createNewNode(2);      root->right = createNewNode(5);      root->left->left = createNewNode(1);      root->left->right = createNewNode(3);         if(isBST(root))             std::cout << tree1 is BST;        else             std::cout << tree1 is not BST;         /* tree2的定义            4          /           2     5        /     /       1     3       */       root =createNewNode(4);      root->left = createNewNode(2);      root->left->left = createNewNode(1);      root->right = createNewNode(5);      root->right->left = createNewNode(3);         if(isBST(root))             std::cout << tree2 is BST;        else             std::cout << tree2 is not BST;         return0;}</iostream>

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击