Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算给定范围内AVL树中的节点数 我需要编写一个C++函数,它给定一个范围(a,b],返回给定范围内的AVL树中的节点数,特别是日志(N)时间复杂度。 如果需要,我可以向树的节点添加更多字段_C++_Algorithm_Tree - Fatal编程技术网

计算给定范围内AVL树中的节点数 我需要编写一个C++函数,它给定一个范围(a,b],返回给定范围内的AVL树中的节点数,特别是日志(N)时间复杂度。 如果需要,我可以向树的节点添加更多字段

计算给定范围内AVL树中的节点数 我需要编写一个C++函数,它给定一个范围(a,b],返回给定范围内的AVL树中的节点数,特别是日志(N)时间复杂度。 如果需要,我可以向树的节点添加更多字段,c++,algorithm,tree,C++,Algorithm,Tree,我应该指出,a,b不一定会出现在树中。例如,如果树的节点是:1,2,5,7,9,10,那么使用参数(3,9)运行函数应该返回3 我应该使用哪种算法来实现这一点?这是一个著名的问题- 基本上,您需要扩充节点,这样当您查看子指针时,您就知道在时间O(1)时子目录树中有多少子目录。很容易看出,这可以在不影响复杂性的情况下完成 一旦你有了这个,你就可以通过从节点到根执行两个遍历来回答任何查询(在这个和那个之间,包含/排除所有可能性)。精确遍历取决于细节(检查函数下拉绑定< >代码>上行绑定< /代码>

我应该指出,a,b不一定会出现在树中。例如,如果树的节点是:1,2,5,7,9,10,那么使用参数(3,9)运行函数应该返回3


我应该使用哪种算法来实现这一点?

这是一个著名的问题-

基本上,您需要扩充节点,这样当您查看子指针时,您就知道在时间O(1)时子目录树中有多少子目录。很容易看出,这可以在不影响复杂性的情况下完成


一旦你有了这个,你就可以通过从节点到根执行两个遍历来回答任何查询(在这个和那个之间,包含/排除所有可能性)。精确遍历取决于细节(检查函数<代码>下拉绑定< <代码> >代码>上行绑定< /代码>,例如C++)。

这是一个著名的问题-< /p> 基本上,您需要扩充节点,这样当您查看子指针时,您就知道在时间O(1)时子目录树中有多少子目录。很容易看出,这可以在不影响复杂性的情况下完成


一旦你有了这个,你就可以通过从节点到根执行两个遍历来回答任何查询(在这个和那个之间,包含/排除所有可能性)。精确遍历取决于细节(检查函数<代码>下拉绑定< <代码> >代码>上行绑定< /代码>,例如C++)。

这是一个著名的问题-< /p> 基本上,您需要扩充节点,这样当您查看子指针时,您就知道在时间O(1)时子目录树中有多少子目录。很容易看出,这可以在不影响复杂性的情况下完成


一旦你有了这个,你就可以通过从节点到根执行两个遍历来回答任何查询(在这个和那个之间,包含/排除所有可能性)。精确遍历取决于细节(检查函数<代码>下拉绑定< <代码> >代码>上行绑定< /代码>,例如C++)。

这是一个著名的问题-< /p> 基本上,您需要扩充节点,这样当您查看子指针时,您就知道在时间O(1)时子目录树中有多少子目录。很容易看出,这可以在不影响复杂性的情况下完成


一旦你有了这个,你就可以通过从节点到根执行两个遍历来回答任何查询(在这个和那个之间,包含/排除所有可能性)。精确的遍历依赖于细节(例如,在C++中检查函数<代码>下拉绑定> <代码>和<代码> UpPulfBooWix/<代码>。.

首先可以实现按键拆分操作。也就是说,给定一棵树,执行
拆分(tree,key,ts,tg)
将键拆分为两棵树;
ts
包含小于
key
的键;
t2
较大或相等的键。此操作可以在O(lg n)中完成

然后,通过两次拆分,第一次在a上,第二次在b上,您可以获得O(lg n)中所需的子集范围

拆分可以按如下方式实现(伪代码):

因为avl树是平衡的,所以位置取O(lgn)。所以两个调用取O(lgn)。非递归版本很简单


我希望你能原谅我的错误。首先,你可以实现一个按键拆分操作。也就是说,给定一棵树,执行
split(tree,key,ts,tg)
将键拆分为两棵树;
ts
包含小于
key
的键;
t2
较大或相等的键。这个操作可以在O(lg n)中完成

然后,通过两次拆分,第一次在a上,第二次在b上,您可以获得O(lg n)中所需的子集范围

拆分可以按如下方式实现(伪代码):

因为avl树是平衡的,所以位置取O(lgn)。所以两个调用取O(lgn)。非递归版本很简单


我希望你能原谅我的错误。首先,你可以实现一个按键拆分操作。也就是说,给定一棵树,执行
split(tree,key,ts,tg)
将键拆分为两棵树;
ts
包含小于
key
的键;
t2
较大或相等的键。这个操作可以在O(lg n)中完成

然后,通过两次拆分,第一次在a上,第二次在b上,您可以获得O(lg n)中所需的子集范围

拆分可以按如下方式实现(伪代码):

因为avl树是平衡的,所以位置取O(lgn)。所以两个调用取O(lgn)。非递归版本很简单


我希望你能原谅我的错误。首先,你可以实现一个按键拆分操作。也就是说,给定一棵树,执行
split(tree,key,ts,tg)
将键拆分为两棵树;
ts
包含小于
key
的键;
t2
较大或相等的键。这个操作可以在O(lg n)中完成

然后,通过两次拆分,第一次在a上,第二次在b上,您可以获得O(lg n)中所需的子集范围

拆分可以按如下方式实现(伪代码):

因为avl树是平衡的,所以位置取O(lgn)。所以两个调用取O(lgn)。非递归版本很简单


我希望您能原谅我的错误

我如何编写此函数?
请提供一个代码示例,说明您到目前为止所做的工作。我们不会为您编写此函数。我澄清了我的错误question@mittelmania我误解了原来的问题。我编辑了我的答案。基本上,阿米·塔沃里是对的。更有趣的是:给出一个立场ard AVL tree,在两个以上键之间的半开间隔内,给出树中键数的严格上下限。
如何编写此函数?
请提供一个代码示例,说明您所做的操作
void split(Node * root, const Key & key, Node *& ts, Node *& tg) noexcept
  {
    if (root == Node::NullPtr)
      return;

    if (key < KEY(root))
      {
         Node * r = RLINK(root), * tgaux = Node::NullPtr;
         split(LLINK(root), key, ts, tgaux);         
         insert(tgaux, root); // insert root in tgaux
         tg = join_ex(tgaux, r);
       }
    else 
      {   // ket greater or equal than key to tg
        Node * l = LLINK(root), *tsaux = Node::NullPtr;
        split(RLINK(root), key, tsaux, tg));
        insert(tsaux, root); // insert root in tsaux
        ts = join_ex(l, tsaux);
       }
  }
long position(Node * root, const Key & key) noexcept
{
  if (r == Node::NullPtr)
    return 0;

  if (key < KEY(root)) 
    return position(LLINK(r), key, p);
  else if (KEY(r) < key) 
    return position(RLINK(r), key) + COUNT(LLINK(r)) + 1;
  else // the root contains key
    return COUNT(LLINK(r));
}