标签:二叉排序树 二叉查找树 判断是否为二叉查找树 判断是否是bst 判断二叉查找树
基于上面的这些性质,自然的就得到了这种判断方式:树中的每个节点都有一个特定的值。
bool isBST(Node* node) { if (node == NULL) return true; //如果左孩子大于根节点,则不是BST if (node->left != NULL && node->left->key> node->key) return false; //如果右孩子节点小于根节点,则不是BST if (node->right != NULL && node->right->key < node->key) return false; //递归的判断 if (!isBST(node->left) || !isBST(node->right)) return false; //检测完毕,所有条件通过,则是BST return true; }但是,这种判断方法是错误的,如下面例子所示,节点4处于根节点3的左子树中,但是函数检测到这棵树是BST.
//如果是BST,则返回true bool isBST(Node * node ) { if ( node == NULL) return true; //如果左子树最大值大于根节点,则返回false if ( node->left != NULL && maxValue( node->left) > node->key) return false; //如果右子树最小值小于根节点,则返回false if ( node->right != NULL && minValue( node->right) < node->key) return false; //递归判断 if (!isBST( node->left) || !isBST( node->right)) return( false); //所有检测都通过,是BST return true; }其中,maxValue以及minValue函数,分别返回一颗非空树中的最大值和最小值。
#include <iostream> struct Node { int key; Node *left; Node *right; }; bool isBSTUtil(Node * node, 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 ) { //空树也是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; return temp; } 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\n"; else std::cout << "tree1 is not BST\n"; /* 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\n"; else std::cout << "tree2 is not BST\n"; return 0; }输出:
//判断是否为BST bool isBST(Node* root) { static Node *prev = NULL; // 中序遍历这棵树,并保存前驱节点至prev中 if (root) { if (!isBST(root->left)) return false; // 检测节点值的合法性 if (prev != NULL && root->key <= prev->key) return false; prev = root; //右子树 return isBST(root->right); } return true; }
标签:二叉排序树 二叉查找树 判断是否为二叉查找树 判断是否是bst 判断二叉查找树
原文地址:http://blog.csdn.net/shltsh/article/details/46510569