如何判断一棵树是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
- 如何判断一棵树是BST树
- BST判断
- BST判断
- 判断一个二叉树是否为BST
- 二叉查找树(BST)---拷贝 相等判断 查找节点 统计节点 统计层数 判断BST
- 判断是否为BST
- 判断BST是否合法
- 判断二叉树是否为二叉搜索树BST
- 判断二叉树是不是二叉查找树(BST)
- 判断二叉树是否为平衡二叉树(BST)
- leetcode之判断是否BST二分搜索树
- LeetCode基础--二叉树--判断是否为BST
- 【树】判断树是否为BST + 求BST的第k个结点 + 判断一个数组是否为BST的后序遍历
- BST树
- BST树
- 判断一棵树是否是BST
- 判断一棵树是否是BST
- 二叉树系列四:Leetcode#98判断二叉树是否为二叉搜索树(BST)
- OkHttp使用教程
- Bzoj2142礼物:组合数取模
- Android Studio技巧 --新学的几个快捷键
- eclipse快速编码插件ex-Zen Coding
- iOS分享功能文档
- 如何判断一棵树是BST树
- 关于指针的认识
- CB弹出对话框 选择目录建立文件夹
- 字符数组转字符串
- ubuntu 中安装和使用 vmare 12.1
- 懒人爱家务_ PopUpWindow使用
- linux下搭载lamp环境的笔记
- 图片缩小(防止OOM的方法)
- 字符串变形