C++ 是二叉树BST,但只有在正确的子级中才允许有重复项
我试图解决一个问题,看看二叉树是否是BST。我找到的解决方案是不带重复项的二叉树。 对于副本,我所做的只是更改了以下部分。此外,只能在右侧子节点中找到重复项,即左侧子节点中的所有子节点都应小于当前节点,但右侧子节点的值可能与父节点的值相同C++ 是二叉树BST,但只有在正确的子级中才允许有重复项,c++,c++11,tree,binary-tree,binary-search-tree,C++,C++11,Tree,Binary Tree,Binary Search Tree,我试图解决一个问题,看看二叉树是否是BST。我找到的解决方案是不带重复项的二叉树。 对于副本,我所做的只是更改了以下部分。此外,只能在右侧子节点中找到重复项,即左侧子节点中的所有子节点都应小于当前节点,但右侧子节点的值可能与父节点的值相同 if (node->data < min || node->data >= max) return 0; return(isBSTUtil(node->left, min, node->data) &
if (node->data < min || node->data >= max)
return 0;
return(isBSTUtil(node->left, min, node->data) &&
isBSTUtil(node->right, node->data, max));
我不知道我哪里错了,但有些测试失败了。这是一个在线评估,我无法获得失败的测试用例。有人能帮我吗。试试下面的代码:
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, long long min, long long 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, long long (node->data) - 1) && /*left smaller*/
isBSTUtil(node->right, node->data, max); /*right can equal or greater*/
}
为了避免下溢,应该使用long-long而不是int。
在某些平台上,long也是4字节,这是不够的。
谢谢您的指点。您是否忘记了上一条语句中的返回值isBSTUtilnode->left,min,node->data&&isBSTUtilnode->right,node->data,max?对不起,这是一个编辑。我错过了。编辑问题。谢谢你指出,在一个树上,它的数据是int型的,它的失败会是什么?现代C++编译器的长度和int大小不同?我所知道的每个现代编译器,包括GCC、Clang、MSVC和ICC,无论您是为32位还是64位进行编译,都会将它们视为4字节。在x64平台上的GCC版本5.4.0,long是8字节,int是4字节。谢谢你指出。你是对的,有些平台long和int有相同的大小。哦,我不知道GCC会这么做。也许OP应该使用long-long。显然,GCC只在Linux上使用long-long:For-ref关于long和int。long-long是最佳实践。
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, long long min, long long 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, long long (node->data) - 1) && /*left smaller*/
isBSTUtil(node->right, node->data, max); /*right can equal or greater*/
}