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