C++ 是二叉树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) &

我试图解决一个问题,看看二叉树是否是BST。我找到的解决方案是不带重复项的二叉树。

对于副本,我所做的只是更改了以下部分。此外,只能在右侧子节点中找到重复项,即左侧子节点中的所有子节点都应小于当前节点,但右侧子节点的值可能与父节点的值相同

  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*/
}