测试树是不是是二叉搜索树[重复]
Posted
技术标签:
【中文标题】测试树是不是是二叉搜索树[重复]【英文标题】:Test if tree is Binary Search tree [duplicate]测试树是否是二叉搜索树[重复] 【发布时间】:2018-08-07 16:33:00 【问题描述】:我知道我不应该在这里问这些类型的问题,但我被卡住了,无法弄清楚问题所在。所以, 我编写了这段代码,它将树的根作为输入,并检查给定的树是否是 BST。但是我没有通过几个测试用例,我不明白为什么?如果有人能告诉我我的代码有什么问题,那将不胜感激。 这是问题Is This a Binary Search Tree?的链接
这里是代码。
bool checkBST(Node* root)
if(root == NULL)
return false;
int d = root->data;
bool r1 = true,r2=true;
if(root->left != NULL)
if(d < root->left->data)
r1 = false;
else
r1 = checkBST(root->left);
if(root->right != NULL)
if(d > root->right->data)
r2 = false;
else
r2 = checkBST(root->right);
return r1 && r2;
【问题讨论】:
测试用例是你的还是你自己写过测试用例?您是否使用调试器逐步完成了有趣的测试用例? 一棵空树可能是一个有效的 BST。 这是什么:r1*r2
使用二元运算符。 r1 && r2
另外,请使用 AND (&&
) 而不是布尔值相乘...
另外r1 = false;
在右边检查应该是r2 = false;
。
【参考方案1】:
问题可能是您仅根据其父节点检查每个节点。请记住,整个子树必须位于父树的任一侧。
EG
10
4
2 12
这将传递您的代码。每个孩子都是与其直接父母相关的正确值。但是 12 比根 10 大,但是在左子树中。
#include <climits>
bool checkBST(Node* root, int min, int max)
if (!root) return true;
return (min <= root->data && root->data <= max)
&& checkBST(root->left, min, root->data-1)
&& checkBST(root->right, root->data+1, max);
bool checkBST(Node* root)
return checkBST(root, INT_MIN, INT_MAX);
【讨论】:
INT_MIN 和 INT_MAX 的初始值是多少? @happysharma:它们是平台特定的 int 最小值和最大值。见:cplusplus.com/reference/climits 好吧,还有一件事,如果你不介意的话,我无法理解传递 root->data-1 和 root->data+1 背后的逻辑。抱歉,我刚开始学习 Algo 和 DS。 @happysharma 因此,当您搜索左子树时,您必须更新最大值,使其低于当前值。所以当我调用checkBST(root->left,...)
时,我将最大值设置为比当前节点的值小一。 root->data-1
@happysharma 因此,当您搜索正确的子树时,您必须更新最小值,使其大于当前值。因此,当我调用checkBST(root->right,...)
时,我将最小值设置为比当前节点的值大一。 root->data+1
【参考方案2】:
为什么不这样:
int checkBST(Node *root, int min, int max)
/* an empty tree is BST */
if (root == NULL)
return true;
/* false if this node violates the min/max constraint */
if (root->data < min || root->data > max)
return 0;
/* otherwise check the subtrees recursively,
tightening the min or max constraint */
return
checkBST(root->left, min, root->data - 1) && // Allow only distinct values
checkBST(root->right, root->data + 1, max);
int checkBST(Node *root)
return checkBST(root, INT_MIN, INT_MAX);
然后你会这样调用函数:
checkBST(tree)
您的主要问题是您没有跟踪子 BST 受限制的 min
和 max
值。此外,null
树是 BST。
【讨论】:
有趣的方法。它适用于具有定义平台限制的任何数字数据。它需要一个前端来保持OP的入口界面。有些东西告诉我,从中提取的编程挑战网站将需要它。 @WhozCraig “它需要一个前端来保持 OPs 入口界面”是什么意思? OPs 函数采用单个节点指针。你的也应该;至少是最初的条目。它是 C++,所以一个简单的重载就可以解决这个问题,即:checkBST(tree)
调用您的 checkBST(tree, INT_MIN, INT_MAX)
否则它将与站点期望的测试套件的预期接口不匹配。
@WhozCraig 哦,谢谢你的提示。查看我的编辑。
已经做了,并且已经打勾。谢谢。以上是关于测试树是不是是二叉搜索树[重复]的主要内容,如果未能解决你的问题,请参考以下文章